HAL 是一个提供 HTTP API 能力给大型语言模型的 Model Context Protocol (MCP) 服务器。它允许 LLM 通过安全、受控的接口进行 HTTP 请求并与其他 Web API 进行交互。HAL 还可以从 OpenAPI/Swagger 规范自动生成工具,实现无缝的 API 集成。
访问我们的综合文档网站以获取详细的指南、示例和 API 参考。
{secrets.key} 替换和自动删除HAL 设计用于与兼容 MCP 的客户端一起工作。以下是一些示例:
将 HAL 添加到您的 Claude Desktop 配置中(npx 将自动安装并运行 HAL):
{
"mcpServers": {
"hal": {
"command": "npx",
"args": ["hal-mcp"]
}
}
}
要启用从 OpenAPI 规范自动生成工具并使用秘密:
{
"mcpServers": {
"hal": {
"command": "npx",
"args": ["hal-mcp"],
"env": {
"HAL_SWAGGER_FILE": "/path/to/your/openapi.json",
"HAL_API_BASE_URL": "https://api.example.com",
"HAL_SECRET_API_KEY": "your-secret-api-key",
"HAL_SECRET_USERNAME": "your-username",
"HAL_SECRET_PASSWORD": "your-password"
}
}
}
}
您还可以直接从 URL 加载 OpenAPI 规范:
{
"mcpServers": {
"hal": {
"command": "npx",
"args": ["hal-mcp"],
"env": {
"HAL_SWAGGER_FILE": "/swagger/v1/swagger.json",
"HAL_API_BASE_URL": "http://localhost:5065",
"HAL_SECRET_API_KEY": "your-secret-api-key"
}
}
}
}
# 启动默认工具的 HAL 服务器
npx hal-mcp
# 或结合 Swagger/OpenAPI 集成
HAL_SWAGGER_FILE=/path/to/api.yaml HAL_API_BASE_URL=https://api.example.com npx hal-mcp
# 或从 URL 加载
HAL_SWAGGER_FILE=/swagger/v1/swagger.json HAL_API_BASE_URL=http://localhost:5065 npx hal-mcp
HAL 支持以下环境变量:
HAL_SWAGGER_FILE:指向 OpenAPI/Swagger 规范文件的路径或 URL(JSON 或 YAML 格式)。可以是:
/path/to/api.yamlhttps://api.example.com/swagger.json/swagger/v1/swagger.json(与 HAL_API_BASE_URL 组合)HAL_API_BASE_URL:API 请求的基本 URL(覆盖 OpenAPI 规范中的服务器指定)HAL_SECRET_*:请求中安全替换的秘密值(例如,HAL_SECRET_TOKEN=abc123)HAL_ALLOW_*:命名空间秘密的 URL 限制(例如,HAL_ALLOW_MICROSOFT="https://azure.microsoft.com/*")HAL_WHITELIST_URLS:允许的 URL 模式的逗号分隔列表(如果设置,则仅允许这些 URL)HAL_BLACKLIST_URLS:阻止的 URL 模式的逗号分隔列表(如果设置,则阻止这些 URL)HAL 提供安全的秘密管理,使敏感信息如 API 密钥、令牌和密码不暴露在对话中,同时仍允许 AI 在 HTTP 请求中使用它们。
环境变量:使用 HAL_SECRET_ 前缀定义秘密:
HAL_SECRET_API_KEY=your-secret-api-key
HAL_SECRET_TOKEN=your-auth-token
HAL_SECRET_USERNAME=your-username
模板替换:在请求中使用 {secrets.key} 语法引用秘密:
https://api.example.com/data?token={secrets.token}{"Authorization": "Bearer {secrets.api_key}"}{"username": "{secrets.username}", "password": "{secrets.password}"}安全性:AI 从未看到实际的秘密值,只看到模板占位符。值在请求时替换。
HAL 自动从返回给 AI 的所有响应中删除秘密值,提供额外的安全层以防止凭据泄露。
[REDACTED]之前(易受攻击):
错误:无法从包含凭据的 URL 构造请求:
https://65GQiI8-1JCOWV1KAuYr0g:-VOIfpydl2GWfucCdEJ1BJ2vrsJyjQ@www.reddit.com/api/v1/access_token
之后(安全):
错误:无法从包含凭据的 URL 构造请求:
https://[REDACTED]:[REDACTED]@www.reddit.com/api/v1/access_token
这种保护是自动的,不需要配置——无论响应中如何出现,HAL 都会删除任何秘密值,确保即使 API 或错误消息试图暴露凭据,AI 也永远不会看到实际值。
HAL 支持将秘密组织成命名空间,并将其限制为特定 URL 以增强安全性:
使用 - 分隔命名空间,使用 _ 分隔键内的单词:
# 单一命名空间
HAL_SECRET_MICROSOFT_API_KEY=your-api-key
# 使用:{secrets.microsoft.api_key}
# 多级命名空间
HAL_SECRET_AZURE-STORAGE_ACCESS_KEY=your-storage-key
HAL_SECRET_AZURE-COGNITIVE_API_KEY=your-cognitive-key
HAL_SECRET_GOOGLE-CLOUD-STORAGE_SERVICE_ACCOUNT_KEY=your-service-key
# 使用:{secrets.azure.storage.access_key}
# 使用:{secrets.azure.cognitive.api_key}
# 使用:{secrets.google.cloud.storage.service_account_key}
使用 HAL_ALLOW_* 环境变量将命名空间秘密限制为特定 URL:
# 限制 Microsoft 秘密到 Microsoft 域
HAL_SECRET_MICROSOFT_API_KEY=your-api-key
HAL_ALLOW_MICROSOFT="https://azure.microsoft.com/*,https://*.microsoft.com/*"
# 限制 Azure 存储秘密到 Azure 存储端点
HAL_SECRET_AZURE-STORAGE_ACCESS_KEY=your-storage-key
HAL_ALLOW_AZURE-STORAGE="https://*.blob.core.windows.net/*,https://*.queue.core.windows.net/*"
# 多个 URL 用逗号分隔
HAL_SECRET_GOOGLE-CLOUD_API_KEY=your-google-key
HAL_ALLOW_GOOGLE-CLOUD="https://*.googleapis.com/*,https://*.googlecloud.com/*"
理解环境变量名称如何成为模板键:
HAL_SECRET_AZURE-STORAGE_ACCESS_KEY
│ │ │
│ │ └─ 键:"ACCESS_KEY" → "access_key"
│ └─ 命名空间:"AZURE-STORAGE" → "azure.storage"
└─ 前缀
最终模板:{secrets.azure.storage.access_key}
逐步分解:
HAL_SECRET_ 前缀 → AZURE-STORAGE_ACCESS_KEY_ 分割 → 命名空间:AZURE-STORAGE,键:ACCESS_KEYAZURE-STORAGE → azure.storage(破折号变为点,小写)ACCESS_KEY → access_key(下划线保留,小写){secrets.azure.storage.access_key}# 简单命名空间
HAL_SECRET_GITHUB_TOKEN=your_token
→ {secrets.github.token}
# 两级命名空间
HAL_SECRET_AZURE-COGNITIVE_API_KEY=your_key
→ {secrets.azure.cognitive.api_key}
# 三级命名空间
HAL_SECRET_GOOGLE-CLOUD-STORAGE_SERVICE_ACCOUNT=your_account
→ {secrets.google.cloud.storage.service_account}
# 复杂键带有下划线
HAL_SECRET_AWS-S3_BUCKET_ACCESS_KEY_ID=your_id
→ {secrets.aws.s3.bucket_access_key_id}
# 无命名空间(旧风格)
HAL_SECRET_API_KEY=your_key
→ {secrets.api_key}
环境变量 模板使用 URL 限制
├─ HAL_SECRET_MICROSOFT_API_KEY ├─ {secrets.microsoft.api_key} ├─ HAL_ALLOW_MICROSOFT
├─ HAL_SECRET_AZURE-STORAGE_KEY ├─ {secrets.azure.storage.key} ├─ HAL_ALLOW_AZURE-STORAGE
├─ HAL_SECRET_AWS-S3_ACCESS_KEY ├─ {secrets.aws.s3.access_key} ├─ HAL_ALLOW_AWS-S3
└─ HAL_SECRET_UNRESTRICTED_TOKEN └─ {secrets.unrestricted.token} └─ (无限制)
场景 1:多云应用
# Azure 服务
HAL_SECRET_AZURE-STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;...
HAL_SECRET_AZURE-COGNITIVE_SPEECH_KEY=abcd1234...
HAL_ALLOW_AZURE-STORAGE="https://*.blob.core.windows.net/*,https://*.queue.core.windows.net/*"
HAL_ALLOW_AZURE-COGNITIVE="https://*.cognitiveservices.azure.com/*"
# AWS 服务
HAL_SECRET_AWS-S3_ACCESS_KEY=AKIA...
HAL_SECRET_AWS-LAMBDA_API_KEY=lambda_key...
HAL_ALLOW_AWS-S3="https://s3.*.amazonaws.com/*,https://*.s3.amazonaws.com/*"
HAL_ALLOW_AWS-LAMBDA="https://*.lambda.amazonaws.com/*"
# Google Cloud
HAL_SECRET_GOOGLE-CLOUD_SERVICE_ACCOUNT_KEY={"type":"service_account"...}
HAL_ALLOW_GOOGLE-CLOUD="https://*.googleapis.com/*"
请求中的使用:
{
"url": "https://mystorageaccount.blob.core.windows.net/container/file",
"headers": {
"Authorization": "Bearer {secrets.azure.storage.connection_string}"
}
}
✅ 有效:URL 匹配 Azure 存储模式
❌ 阻止:如果用于 https://s3.amazonaws.com/bucket - 错误的服务!
场景 2:开发 vs 生产
# 开发环境
HAL_SECRET_DEV-API_KEY=dev_key_123
HAL_ALLOW_DEV-API="https://dev-api.example.com/*,https://staging-api.example.com/*"
# 生产环境
HAL_SECRET_PROD-API_KEY=prod_key_456
HAL_ALLOW_PROD-API="https://api.example.com/*"
场景 3:部门隔离
# 营销团队 API
HAL_SECRET_MARKETING-CRM_API_KEY=crm_key...
HAL_SECRET_MARKETING-ANALYTICS_TOKEN=analytics_token...
HAL_ALLOW_MARKETING-CRM="https://api.salesforce.com/*"
HAL_ALLOW_MARKETING-ANALYTICS="https://api.googleanalytics.com/*"
# 工程团队 API
HAL_SECRET_ENGINEERING-GITHUB_TOKEN=ghp_...
HAL_SECRET_ENGINEERING-JIRA_API_KEY=jira_key...
HAL_ALLOW_ENGINEERING-GITHUB="https://api.github.com/*"
HAL_ALLOW_ENGINEERING-JIRA="https://*.atlassian.net/*"
当 URL 限制被违反时,您会收到明确的错误消息:
❌ 错误:秘密 'azure.storage.access_key'(命名空间:AZURE-STORAGE)不允许用于 URL 'https://api.github.com/user'。
允许的模式:https://*.blob.core.windows.net/*, https://*.queue.core.windows.net/*
这有助于您快速识别:
| 环境变量 | 模板使用 | URL 限制 |
|---|---|---|
HAL_SECRET_GITHUB_TOKEN | {secrets.github.token} | HAL_ALLOW_GITHUB |
HAL_SECRET_AZURE-STORAGE_KEY | {secrets.azure.storage.key} | HAL_ALLOW_AZURE-STORAGE |
HAL_SECRET_AWS-S3_ACCESS_KEY | {secrets.aws.s3.access_key} | HAL_ALLOW_AWS-S3 |
HAL_SECRET_GOOGLE-CLOUD_API_KEY | {secrets.google.cloud.api_key} | HAL_ALLOW_GOOGLE-CLOUD |
模式:HAL_SECRET_<NAMESPACE>_<KEY> → {secrets.<namespace>.<key>} + HAL_ALLOW_<NAMESPACE>
非命名空间的秘密(没有 URL 限制)继续像以前一样工作:
HAL_SECRET_API_KEY=your-key
# 使用:{secrets.api_key} - 适用于任何 URL(无限制)
HAL 支持全局 URL 过滤,以控制可以通过白名单或黑名单模式访问哪些 URL。这提供了超出命名空间基础秘密限制的额外安全层。
当设置 HAL_WHITELIST_URLS 时,只有匹配指定模式的 URL 才被允许:
# 只允许对 GitHub 和 Google API 的请求
HAL_WHITELIST_URLS="https://api.github.com/*,https://*.googleapis.com/*"
当设置 HAL_BLACKLIST_URLS 时,所有 URL 都被允许除了那些匹配指定模式的 URL:
# 阻止对内部网络和 localhost 的请求
HAL_BLACKLIST_URLS="http://localhost:*,https://192.168.*,https://10.*,https://172.16.*"
URL 模式支持使用 * 的通配符匹配:
https://api.example.com/* - 匹配 API 下的任何路径https://*.example.com/* - 匹配任何子域*://internal.company.com/* - 匹配任何协议HAL_WHITELIST_URLS 和 HAL_BLACKLIST_URLS,则使用白名单并记录警告# 生产环境 - 只允许特定 API
HAL_WHITELIST_URLS="https://api.stripe.com/*,https://*.googleapis.com/*,https://api.github.com/*"
# 开发环境 - 阻止内部服务
HAL_BLACKLIST_URLS="http://localhost:*,https://192.168.*,https://admin.internal.com/*"
# 严格设置 - 只允许 HTTPS 到特定域
HAL_WHITELIST_URLS="https://api.trusted-service.com/*,https://webhooks.trusted-service.com/*"
{
"url": "https://api.github.com/user",
"headers": {
"Authorization": "Bearer {secrets.github_token}",
"Accept": "application/vnd.github.v3+json"
}
}
在发出请求前,{secrets.github_token} 将被替换为 HAL_SECRET_GITHUB_TOKEN 环境变量的值。
这些工具始终可用,无论配置如何:
list-secrets获取可用于 {secrets.key} 语法的秘密键列表。
参数:无
示例响应:
可用秘密(总计 3 个):
您可以在 HTTP 请求中使用这些秘密键,使用 {secrets.key} 语法:
1. {secrets.api_key}
2. {secrets.github_token}
3. {secrets