使用说明
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,没有客户端密钥。
- 首选 配置→ 集成→ 卤代PSA API→ 应用程序→ New
- 集 认证方式 到 授权码(本地应用程序)
- 集 登录重定向URL 到
http://localhost:3000/callback(添加用于生产的其他URL,例如。https://your-domain.com/callback) - 启用 允许代理登录
- 离开 客户端密钥 空白
- 保存并复制 客户端ID
备选方案:客户端ID和密码(服务)
如果您的HaloPSA实例需要机密客户端,或者您需要在没有用户登录的情况下进行机器对机器访问,请使用此选项。
- 首选 配置→ 集成→ 卤代PSA API→ 应用程序→ New
- 集 认证方式 到 客户端ID和密码(服务)
- 集 登录重定向URL 到
http://localhost:3000/callback - 启用 允许代理登录
- 保存并复制 客户端ID 和 客户端密钥
- 添加
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.本地开发(桌面标准)
-
创建
.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 -
构建:
dotnet build -
配置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"] } } } -
重新启动MCP主机。
-
首次连接时,如果您未登录,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)onhalopsa_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,sethalopsa.tokenStore.backend=redis并提供HALOPSA_REDIS_CONNECTION(或HALOPSA_REDIS_CONNECTION_FILE)因此会话、OAuth状态和DCR是原子共享的。 - MCP流式HTTP会话在SDK中是本地进程 除非您启用无状态模式。随着
replicaCount > 1,setMCP_HTTP_STATELESS=1(自动时backend=redis)所以每个POST /mcp独立处理——这与Claude.ai的连接器后端在没有cookie关联的情况下调用工具的方式相匹配。用于状态模式(MCP_HTTP_STATELESS=0),使用nginxupstream-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,其中:
- 构建多拱形图像(
linux/amd64,linux/arm64) - 将SPDX SBOM附加到OCI清单(
sbom: true) - 使用共同签名无密钥签名(GitHub OIDC→ Sigstore)
- 发布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)。 |
故障排除
“未通过身份验证”:
- 对于桌面stdio:运行
halopsa_setup或打开http://localhost:3000/--在浏览器中使用登录URL - 登录后,在MCP主机中重试(无需重新启动)
- 对于远程HTTP客户端:重新添加集成或启动新会话
- 如果端口3000正在使用中,请检查MCP日志中的实际登录URL(临时端口回退)
查询返回0行:
- 叫
halopsa_get_schema首先验证表/列名 - 检查日期时间筛选器是否使用UTC格式
- 对于满意度调查,请使用
feedback桌子与halopsa_query - 对于时间表和操作分析,请使用架构中的关系助手
- API报告可能需要HaloPSA中的特定权限
未找到时间表记录:
- 使用
halopsa_query要查找时间表ID:SELECT TSid, TSunum, TSdate FROM timesheet WHERE TSunum = <agent_id> AND TSdate >= '2026-03-04T00:00:00Z' - 如果该日期没有记录,请致电
halopsa_create_timesheet更新前
表关系
该模式包括用于常见表关系的帮助程序:
- 故障 → 行动失误 (工单操作和更新)
- 故障 → 时间表.故障 (根据票记录的工作时间)
- 故障 → 反馈。Fb故障。 (客户满意度调查)
- 故障。请求类型 → 安魂曲。自动识别技术 (请求类型配置)
使用 halopsa_get_schema 查看连接这些表的示例查询。
需求
- .NET 10.0 SDK(用于本地开发)
- 已注册OAuth客户端的HaloPSA实例
贡献
看 贡献.md 和 代码_OF_CONDUCT.md.安全问题: 安全.md.
许可证
麻省理工学院——见 许可证.
