HaloPSA MCP服务器

HaloPSA MCP服务器是一个用于查询和管理HaloPSA工单、代理、客户和报告数据的服务,支持SQL和REST API访问,并提供完整的读写功能。

  • by redanthrax
  • C#
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 redanthrax/halopsa-mcp

使用说明

HaloPSA MCP服务器

MCP服务器 Halopsa --通过SQL或REST API查询票证、代理、客户端和报告数据。对工单、操作和时间表的完全读/写支持。

免责声明: 这是一个独立的开源项目。它不隶属于HaloPSA或NinjaOne,也不受其认可或支持。

看 更改日志.md 发布历史。Docker镜像作为semver标签发布在 Docker 中心 (redanthrax/halopsa-mcp:<version> --没有 latest 标签)。

特性

  • 使用PKCE进行OAuth 2.1身份验证
  • 双模:stdio(桌面MCP主机)+流式HTTP(远程MCP客户端/生产)
  • Stdio模式包括一个后台OAuth服务器——无需重新启动即可进行身份验证
  • 用于高效计数、聚合和基于日期的过滤的SQL查询工具
  • 带有状态ID、代理ID和查询示例的实时架构
  • 自动令牌刷新
  • 调整响应以最大限度地减少上下文使用
  • 完整的票证生命周期:创建、读取、更新、添加操作
  • 时间表管理:日期记录、时间条目、提交/批准工作流

HaloPSA设置

在配置MCP服务器之前,在HaloPSA中创建一个API应用程序。

推荐:授权代码(本地应用程序)

这是推荐的设置——使用OAuth 2.1授权码+PKCS,没有客户端密钥。

  1. 首选 配置→ 集成→ 卤代PSA API→ 应用程序→ New
  2. 集 认证方式 到 授权码(本地应用程序)
  3. 集 登录重定向URL 到 http://localhost:3000/callback (添加用于生产的其他URL,例如。 https://your-domain.com/callback)
  4. 启用 允许代理登录
  5. 离开 客户端密钥 空白
  6. 保存并复制 客户端ID

备选方案:客户端ID和密码(服务)

如果您的HaloPSA实例需要机密客户端,或者您需要在没有用户登录的情况下进行机器对机器访问,请使用此选项。

  1. 首选 配置→ 集成→ 卤代PSA API→ 应用程序→ New
  2. 集 认证方式 到 客户端ID和密码(服务)
  3. 集 登录重定向URL 到 http://localhost:3000/callback
  4. 启用 允许代理登录
  5. 保存并复制 客户端ID 和 客户端密钥
  6. 添加 HALOPSA_CLIENT_SECRET=your-secret 到你的 .env 文件

注: 不要使用 隐式流(单页应用程序) --它在OAuth 2.1中已被弃用,其安全性不如授权码+PKCE。

部署模式

模式 受众 传输 授权表面
当地/标准 笔记本电脑上的桌面MCP主机 stdin/stdout+后台OAuth :3000 单用户、单HaloPSA租户
码头工人 自托管,单主机 可流式HTTP :3000 DCR可选;绑定到本地主机或受信任的局域网
AKS/Kubernetes 互联网暴露的多用户MCP服务器 入口+TLS后面的可流式HTTP DCR门控、网络策略、HSTS、只读rootfs

对所有三个使用相同的图像/二进制文件;只有环境变量和周围的基础设施会发生变化。

1.本地开发(桌面标准)

  1. 创建 .env (复印件 .env.example):

    HALOPSA_URL=https://your-tenant.halopsa.com
    HALOPSA_CLIENT_ID=your-client-id
    HALOPSA_TOKEN_STORE=./data/tokens.json
    HALOPSA_DPKEY_DIR=./data/dp-keys
    AUTH_BASE_URL=http://localhost:3000
    LOG_FORMAT=text
    
  2. 构建:

    dotnet build
    
  3. 配置MCP主机的stdio条目(示例配置形状):

    主人的 env 挡块未通过 wsl.exe.将env变量放入 .env.

    WSL(推荐):

    {
      "mcpServers": {
        "halopsa": {
          "command": "wsl.exe",
          "args": [
            "--distribution", "Ubuntu",
            "bash", "-c",
            "cd /path/to/halopsa-mcp && exec ./bin/Debug/net10.0/HaloPsaMcp"
          ]
        }
      }
    }
    

    本机Windows:

    {
      "mcpServers": {
        "halopsa": {
          "command": "dotnet",
          "args": ["run", "--project", "C:\\path\\to\\halopsa-mcp"]
        }
      }
    }
    
  4. 重新启动MCP主机。

  5. 首次连接时,如果您未登录,MCP服务器 在浏览器中打开登录页面 并发送 服务器指令 到主机提示登录。完成HaloPSA登录,然后在主机中重试——不需要重新启动。集 HALOPSA_AUTO_OPEN_LOGIN=0 禁用自动打开。

2.Docker(自托管HTTP)

已发货 docker-compose.yml 使用强化默认值运行映像:非根UID 1001, read_only: true, cap_drop: ALL, no-new-privileges,tmpfs /tmp,和一个单一 ./data 绑定令牌+数据保护密钥的挂载。

cp .env.example .env   # fill in HALOPSA_URL + HALOPSA_CLIENT_ID
docker compose up -d

对于没有作曲的单次跑步:

docker run -d \
  --name halopsa-mcp \
  --user 1001:1001 \
  --read-only --tmpfs /tmp \
  --cap-drop ALL --security-opt no-new-privileges:true \
  -p 3000:3000 \
  -v ./data:/app/data \
  -e HALOPSA_URL=https://your-tenant.halopsa.com \
  -e HALOPSA_CLIENT_ID=your-client-id \
  -e AUTH_BASE_URL=https://your-domain.com \
  -e HALOPSA_DPKEY_DIR=/app/data/dp-keys \
  redanthrax/halopsa-mcp:1.0.23

从以下位置固定到特定的semver标签 GitHub 发布 或使用 image.digest 在Kubernetes中。

如果你将其暴露给公共互联网,请使用TLS终止的反向代理(Caddy、Traefik、nginx)。对于Claude.ai组织连接器,请离开 MCP_DCR_INITIAL_ACCESS_TOKEN 未设置(或已设置 MCP_ALLOW_OPEN_DCR=1)并配置 MCP_CORS_ALLOWED_ORIGINS --看 helm/halopsa-mcp/values-claude-connector.example.yaml.

3.AKS/Kubernetes(Helm)

Helm图表位于 helm/halopsa-mcp/ 附带强化默认设置:只读根文件系统, seccompProfile: RuntimeDefault,没有自动挂载的SA令牌, 默认情况下启用网络策略,播客中断预算,以及为 dcrInitialAccessToken /客户端机密/Redis连接。

helm upgrade --install halopsa-mcp helm/halopsa-mcp/ \
  --namespace halopsa-mcp --create-namespace \
  --set halopsa.url=https://your-tenant.halopsa.com \
  --set halopsa.clientId=your-client-id \
  --set halopsa.authBaseUrl=https://halopsa-mcp.example.com \
  --set halopsa.publicBaseUrl=https://halopsa-mcp.example.com \
  --set ingress.enabled=true \
  --set ingress.hosts[0].host=halopsa-mcp.example.com \
  --set networkPolicy.enabled=true \
  --set dcrInitialAccessToken=$(openssl rand -hex 32)

对于机密客户端(客户端ID+机密方法),在不提交机密的情况下提供机密:

--set-file halopsa.clientSecret=./halopsa-client-secret.txt

对于多个副本(HA),请使用共享的Redis会话存储:

--set replicaCount=3 \
--set halopsa.tokenStore.backend=redis \
--set halopsa.redisConnection='redis-master:6379,password=...,ssl=true'

生产检查表:

  • []TLS被入口终止(证书管理器或Azure应用程序网关)
  • [ ] networkPolicy.enabled=true (如果不使用ingress nginx,请调整ingress命名空间)
  • [ ] AUTH_BASE_URL / halopsa.authBaseUrl 匹配公共连接器URL
  • []HaloPSA登录重定向URL包括 https://<host>/callback
  • []公共发现终结点返回 200: /.well-known/oauth-* 和 /.well-known/mcp/schema
  • []克劳德连接器:打开DCR+CORS+重定向允许列表(values-claude-connector.example.yaml)
  • [ ] image.digest 着手 sha256:... (首选)或 image.tag 固定在SemVer上——不是 latest
  • []从您的私有ACR(Docker Hub的镜像)中提取的映像
  • []Azure密钥库支持的数据保护密钥(请参阅限制)
  • [ ] halopsa.publicBaseUrl 设置为外部可访问的URL(例如。, https://your-domain.com)

Helm值参考

关键字 默认值 目的
replicaCount 1 增加时 halopsa.tokenStore.backend=redis.
halopsa.tokenStore.backend file file 对于单个复制品; redis 对于HA。
halopsa.redisConnection "" StackExchange。后端为时的Redis连接字符串 redis.
image.digest "" 生产: sha256:... 从释放证明或 docker buildx imagetools inspect.
image.tag "" (Chart.appVersion) 在以下情况下使用 image.digest 是空的。
serviceAccount.create true
serviceAccount.automountServiceAccountToken false 应用程序不调用K8s API。
securityContext.readOnlyRootFilesystem true 可写路径为PVC+tmpfs /tmp.
podSecurityContext.seccompProfile.type RuntimeDefault
networkPolicy.enabled true 限制对发布命名空间的入口和对DNS的出口/ :443 /IMDS。集 false 仅适用于受约束的集群。
podDisruptionBudget.enabled false 仅在复制计数大于1时有用。
dcrInitialAccessToken "" 设置后,闸门 /register.
dcrAllowedRedirectUris "" 可选DCR重定向URI分配列表(逗号分隔的绝对URI)。
halopsa.dpKeyDir /app/data/dp-keys DataProtection密钥目录。
logFormat json 使用 text 仅用于调试。
readyVerbose false 仅对受信任的集群内抓取器设置为true。
persistence.enabled true RWO PVC用于令牌+DP密钥。

配置参考

到处都需要

环境 目的
HALOPSA_URL HaloPSA租户URL
HALOPSA_CLIENT_ID OAuth客户端ID

可选的

环境 默认 目的
HALOPSA_CLIENT_SECRET (未设置) 仅适用于“客户端ID+密钥”方法
HALOPSA_TOKEN_STORE_BACKEND file file (默认)或 redis 用于多副本HTTP
HALOPSA_TOKEN_STORE ./data/tokens.json 加密令牌存储路径(文件后端)
HALOPSA_REDIS_CONNECTION (未设置) 后端为时的Redis连接字符串 redis
HALOPSA_REDIS_CONNECTION_FILE (未设置) Docker风格:从挂载的文件中读取Redis连接(K8s中首选)
HALOPSA_CLIENT_SECRET_FILE (未设置) 从挂载的文件而不是env读取客户端机密
MCP_DCR_INITIAL_ACCESS_TOKEN_FILE (未设置) 从挂载的文件中读取DCR初始访问令牌
MCP_ENABLED_TOOLS (所有工具) 逗号分隔的同位语,例如。 halopsa_query,halopsa_list_tickets,halopsa_list_agents
MCP_METRICS_ENABLED 0 设置 1 暴露门控 /metrics (普罗米修斯文本格式)
MCP_METRICS_TOKEN (未设置) 需要可选的不记名令牌 /metrics
MCP_HTTP_STATELESS 汽车 1/0/auto --无状态流式HTTP(否 Mcp-Session-Id 亲和力)。 自动:启用时 HALOPSA_TOKEN_STORE_BACKEND=redis. 多副本+服务器到服务器MCP调用者(Claude.ai org连接器)需要。
MCP_HTTP_IDLE_TIMEOUT_MINUTES 120 仅状态模式:404之前的空闲会话TTL
HALOPSA_DPKEY_DIR ./data/dp-keys 数据保护密钥环
HTTP_PORT 3000 侦听器端口
AUTH_BASE_URL http://localhost:3000 外部基础URL——用于OAuth回调和 WWW-Authenticate
HALOPSA_PUBLIC_URL ${AUTH_BASE_URL} 登录链接的公共基础URL(默认为 AUTH_BASE_URL)
HALOPSA_REDIRECT_URI ${AUTH_BASE_URL}/callback 仅当回调路径不同时才覆盖
MCP_DCR_INITIAL_ACCESS_TOKEN (未设置) 可选。设置后,闸门 /register (DCR)除非 MCP_ALLOW_OPEN_DCR=1。在授权服务器元数据中发布。
MCP_ALLOW_OPEN_DCR (未设置) 1 =允许未经身份验证的DCR(Claude.ai org连接器需要)。价格有限。
MCP_DCR_ALLOWED_REDIRECT_URIS (未设置) 可选逗号分隔的DCR重定向URI分配列表。设置后,每个 /register 规范化后,redirect_uri必须与此列表匹配。
MCP_CORS_ALLOWED_ORIGINS https://claude.ai MCP/OuthCORS允许逗号分隔的浏览器源(Claude.ai连接器需要逗号分隔)。
HTTP_BIND_ALL (未设置) 1 =将stdio OAuth绑定到所有接口(默认:仅限localhost)
TRUSTED_PROXY_CIDRS RFC1918私有 逗号分隔的CIDR X-Forwarded-*; none 禁用
MCP_READY_VERBOSE 0 1 详细披露 /ready JSON用于可信的抓取器
LOG_FORMAT json text 用于人类可读控制台
HALOPSA_SCHEMA_PATH ./schema 覆盖架构目录目录

模式

模式 用例 命令 传输
工作室 (默认) 桌面MCP主机(本地) dotnet run OAuth端口3000上的stdin/stdout+后台HTTP
超文本传输协议 远程MCP客户端/生产 dotnet run -- --http 端口3000上的流式HTTP

安全态势

  • OAuth 2.1授权码+PKCE
  • 不同的旋转刷新令牌(mcr_*);持票人(mcp_*)在旋转过程中保持稳定
  • 动态客户端注册可选地由初始访问令牌控制
  • SQL列表(SqlGuard)on halopsa_query:仅 SELECT/WITH … SELECT,没有评论/;/DDL/DML/EXEC,8000个字符上限
  • 在HTTP模式下启用HSTS+ForwardedHeaders
  • 令牌+DCR注册通过ASP静态加密。NET数据保护
  • 通过Redis在副本之间共享OAuth/DCR状态(或文件+观察器以获得最佳HA)
  • 结构化的 tool_audit 每次MCP工具调用的记录行(user, tool, args_hash, traceId, status)
  • 每个部署工具通过以下方式进行分配 MCP_ENABLED_TOOLS
  • 门控 /metrics 端点时 MCP_METRICS_ENABLED=1
  • 从日志中编辑的HaloPSA错误响应体
  • 容器:非根UID 1001,无卷曲/wget,仅限K8s探头

局限性

  • 文件后端是尽力而为的多副本。 默认 HALOPSA_TOKEN_STORE_BACKEND=file 使用本地加密的JSON文件+RWO PVC,并重新加载FileSystemWatcher。OAuth流状态和DCR注册遵循相同的模式。对于 replicaCount > 1,set halopsa.tokenStore.backend=redis 并提供 HALOPSA_REDIS_CONNECTION (或 HALOPSA_REDIS_CONNECTION_FILE)因此会话、OAuth状态和DCR是原子共享的。
  • MCP流式HTTP会话在SDK中是本地进程 除非您启用无状态模式。随着 replicaCount > 1,set MCP_HTTP_STATELESS=1 (自动时 backend=redis)所以每个 POST /mcp 独立处理——这与Claude.ai的连接器后端在没有cookie关联的情况下调用工具的方式相匹配。用于状态模式(MCP_HTTP_STATELESS=0),使用nginx upstream-hash-by: $http_mcp_session_id 或缩放到一个复制品。
  • PVC上的数据保护键。 幸存的集群重建需要备份PVC或使用Azure密钥库进行包装。
  • 每次部署一个HaloPSA租户。

威胁模型

此服务器设计用于 操作员控制部署 在这种情况下,组织信任自己的基础设施,但必须限制人工智能客户端可以对HaloPSA做什么。

信任假设

  • OAuth用户同意是主要的关卡。 任何完成动态客户端注册并通过HaloPSA登录驱动用户的MCP客户端都会收到该用户HaloPSA权限范围内的会话。DCR是速率受限的;可选择用 MCP_DCR_INITIAL_ACCESS_TOKEN 用于私人部署。
  • MCP服务器继承HaloPSA授权。 工具将HaloPSA称为经过身份验证的用户。为共享团队或组织范围的连接器提供专用的低权限OAuth应用程序,而不是重用超级管理应用程序。
  • SqlGuard通过设计强制执行只读SQL。 halopsa_query 仅接受 SELECT / WITH … SELECT 与报告数据库相比,没有DDL、DML、注释或多语句批处理。其他工具使用类型化的REST端点;限制表面积 MCP_ENABLED_TOOLS.
  • 秘密应该使用 *_FILE 在生产中安装。 更喜欢 HALOPSA_REDIS_CONNECTION_FILE 和 MCP_DCR_INITIAL_ACCESS_TOKEN_FILE 覆盖纯env变量,使值永远不会出现在 /proc/<pid>/environ 或 kubectl describe.
  • 重定向URI在注册时被规范化 (小写主机,删除默认端口,删除尾部斜线)因此 /cb 和 /cb/ 比赛始终如一。可选择使用以下命令强制执行严格的回调分配列表 MCP_DCR_ALLOWED_REDIRECT_URIS.

超出范围/剩余风险

  • 恶意但经过身份验证的用户可以使用自己的HaloPSA权限调用每个启用的工具(按设计)。
  • 文件后端多副本同步最终是一致的;使用Redis实现严格的HA。
  • 容器图像使用共同签名(无密钥、Sigstore)进行签名,并在OCI清单中包含SPDX SBOM;CycloneDX SBOM附加到GitHub发布版本中,用于准入策略验证(Approval/Kyverno)。

供应链

发布标签(v*)触发器 .github/workflows/docker-build.yml,其中:

  1. 构建多拱形图像(linux/amd64, linux/arm64)
  2. 将SPDX SBOM附加到OCI清单(sbom: true)
  3. 使用共同签名无密钥签名(GitHub OIDC→ Sigstore)
  4. 发布CycloneDX SBOM工件以进行离线验证

在部署时验证:

cosign verify redanthrax/halopsa-mcp:<version> --certificate-identity-regexp='.*' --certificate-oidc-issuer-regexp='.*'

可用工具

核心

工具 说明
halopsa_query 主要工具。 针对报表数据库的SQL SELECT。最适合计数、聚合、日期过滤和满意度调查分析。所有日期时间都是UTC——在查询之前转换本地时间。
halopsa_get_schema 返回表/列名、实时状态ID、代理ID和示例查询。在编写SQL之前调用。
halopsa_setup 桌面标准。 检查本地设置、会话状态、登录URL和故障排除步骤。安装时或登录失败时呼叫。
halopsa_auth_status 检查当前身份验证状态。如有任何HaloPSA请求,请先致电。
halopsa_whoami 解码访问令牌并返回授予的作用域和身份声明(agent_id, role, client_id等等)。登录后立即使用。
halopsa_capabilities 探测HaloPSA端点,以发现活动令牌实际具有哪些权限/范围。返回每个功能的允许/拒绝映射。
halopsa_list_contracts 列表 /api/ClientContract 记录(预算/使用小时数)。筛选依据 clientId 或 search。当报告数据库不可用时使用。

门票

工具 说明
halopsa_list_tickets 按关键字或过滤器搜索门票(count, status, clientId, agentId, search).返回摘要字段。
halopsa_get_ticket 通过ID获取特定门票的完整详细信息
halopsa_create_ticket 创建新票证(summary, details, clientId, agentId, statusId, priorityId, ticketTypeId, siteId).使用0作为可选字段以使用默认值。
halopsa_update_ticket 按ID更新现有票证。对可选字段使用0保持不变。

行动

工具 说明
halopsa_list_actions 列出特定票证的注释/更新(ticketId, count).返回摘要字段。
halopsa_add_action 在工单上添加注释/动作。需要 ticketId, outcomeId (从 halopsa_get_outcomes),可选 note, timeTaken, newStatus, hiddenFromUser.
halopsa_get_outcomes 获取有效的结果ID以供使用 halopsa_add_action.

时间表

工具 说明
halopsa_get_timesheet 按ID获取时间表日期记录,包括所有时间条目。如果该日期不存在记录,则返回id=0——使用创建一个 halopsa_create_timesheet.
halopsa_create_timesheet 为代理创建新的时间表日期记录(agentId, date,可选 startTime, endTime, utcOffset).
halopsa_update_timesheet 更新轮班时间或提交/批准时间表日期记录。获取当前状态并应用更改。支持 startTime, endTime, submitApproval, approve, reject, revertApproval.
halopsa_list_timesheet_events 列出日期范围的时间条目(startDate, endDate,可选 agentId).所有日期时间必须是UTC。
halopsa_upsert_timesheet_event 创建或更新时间条目。集 id=0 创造。领域: ticketId, agentId, startDate, endDate, timeTaken (小时), note, subject, clientId, siteId.
halopsa_delete_timesheet_event 按ID删除时间条目。使用 halopsa_list_timesheet_events 首先查找ID。

目录

工具 说明
halopsa_list_clients 列出客户(公司)。筛选依据 search.
halopsa_get_client 按ID获取单个客户端
halopsa_list_sites 列出网站 clientId.
halopsa_list_agents 列出内部代理。筛选依据 search.
halopsa_list_users 列出最终用户(客户联系人)。筛选依据 clientId 或 search.

资产与知识

工具 说明
halopsa_list_assets 列出管理资产。筛选依据 clientId 或 search.
halopsa_get_asset 按ID获取单个资产
halopsa_list_kb_articles 列出知识库文章。筛选依据 search.
halopsa_get_kb_article 按ID获取单个KB文章

报告与调查

工具 说明
halopsa_list_reports 列出已保存的报告定义。
halopsa_get_report_definition 按ID获取报表的参数/SQL/布局
halopsa_run_report 运行已保存的报告;过 parameters 作为JSON对象。
halopsa_list_surveys 列出满意度调查回复。筛选依据 ticketId.
halopsa_list_statuses 列出票证状态。可选的 type 过滤器。
halopsa_list_request_types 列出请求类型(类别)。

项目和进度安排

工具 说明
halopsa_list_projects 列出项目。筛选依据 clientId 或 search.
halopsa_list_opportunities 列出销售机会。筛选依据 clientId 或 search.
halopsa_list_appointments 列出约会。筛选依据 agentId 以及UTC日期范围。

数据库目录

MCP服务器附带了HaloPSA报告数据库模式的离线转储 schema/catalog.json (845个表,15个域)。这些工具使MCP客户端在规划SQL钻取域时能够以低成本浏览它→ 表格→ 列,而不是将3MB转储到上下文中。

工具 说明
halopsa_db_domains 列出15个数据库域,包括表计数和单行描述。在计划查询时首先调用此命令。
halopsa_db_tables 列表表(可按以下条件筛选 domain 和子字符串 search)具有行数、主键和FK目标。
halopsa_db_columns 一张表的完整列+FK详细信息。通过 columnSearch 缩小宽桌子的范围(FAULTS有625列)。
halopsa_db_search 查找名称包含术语的表/列。当你不知道哪个表包含一个概念时使用。

在构建/发布时,架构文件夹会自动复制到二进制文件旁边。用以下命令覆盖路径 HALOPSA_SCHEMA_PATH 如果你把它放在别处。

逃生舱口

工具 说明
halopsa_api_call 直接HaloPSA REST调用类型化工具未涵盖的端点。路径必须以开头 /api/ (仅限GET/POST/PUT)。

故障排除

“未通过身份验证”:

  1. 对于桌面stdio:运行 halopsa_setup 或打开 http://localhost:3000/ --在浏览器中使用登录URL
  2. 登录后,在MCP主机中重试(无需重新启动)
  3. 对于远程HTTP客户端:重新添加集成或启动新会话
  4. 如果端口3000正在使用中,请检查MCP日志中的实际登录URL(临时端口回退)

查询返回0行:

  1. 叫 halopsa_get_schema 首先验证表/列名
  2. 检查日期时间筛选器是否使用UTC格式
  3. 对于满意度调查,请使用 feedback 桌子与 halopsa_query
  4. 对于时间表和操作分析,请使用架构中的关系助手
  5. API报告可能需要HaloPSA中的特定权限

未找到时间表记录:

  1. 使用 halopsa_query 要查找时间表ID: SELECT TSid, TSunum, TSdate FROM timesheet WHERE TSunum = <agent_id> AND TSdate >= '2026-03-04T00:00:00Z'
  2. 如果该日期没有记录,请致电 halopsa_create_timesheet 更新前

表关系

该模式包括用于常见表关系的帮助程序:

  • 故障 → 行动失误 (工单操作和更新)
  • 故障 → 时间表.故障 (根据票记录的工作时间)
  • 故障 → 反馈。Fb故障。 (客户满意度调查)
  • 故障。请求类型 → 安魂曲。自动识别技术 (请求类型配置)

使用 halopsa_get_schema 查看连接这些表的示例查询。

需求

  • .NET 10.0 SDK(用于本地开发)
  • 已注册OAuth客户端的HaloPSA实例

贡献

看 贡献.md 和 代码_OF_CONDUCT.md.安全问题: 安全.md.

许可证

麻省理工学院——见 许可证.