关于 coral-create-source-spec
Coral Create Source Spec 技能用于编写或修复 Coral 的 YAML 数据源规范,面向外部开发者和 Coral 贡献者,指导 lint、加载、查询与迭代验证数据结构和设置输入。
主要功能
- 01编写独立 YAML 数据源规范
- 02定义表、筛选器和函数
- 03配置凭据与 OAuth
- 04Lint 并测试数据源规范
- 05检查公开的表和列
- 06使用 Coral SQL 验证数据源
适用场景
- 01为外部 API 创建数据源规范
- 02修复数据源清单
- 03添加前检查规范结构
- 04查询数据源以验证结构
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ withcoral/ skills --skill coral-create-source-spec安装后在 Claude Code 中输入/coral-create-source-spec确认已加载。
附带文件agents/openai.yamlreferences/http-source-checklist.md
详细介绍
Coral 源规范
在编写或修复 Coral 源规范时使用此技能。
目标
生成有效且可查询的 Coral 源规范,并确保它适用于:
coral source lint <path>coral source add --file <path>coral source test <name>coral sqlcoral.tables和coral.columns- 用于源变量和密钥的
coral.inputs
默认模式
默认面向外部开发者独立编写源规范。
这意味着:
- 创建 YAML 源规范文件
- 尽早使用
coral source lint <path>对其进行 lint 检查 - 需要将其作为源进行测试时,使用
coral source add --file <path>将其添加到 Coral - 通过查询进行验证
- 反复迭代,直至结构正确
只有当用户明确要编辑 Coral 仓库时,才切换到 Coral 仓库布局。
输出模式
- 外部编写:
- 创建独立的源规范,例如
./my-source.yaml - 使用
coral source lint ./my-source.yaml验证结构 - 需要通过 Coral 查询时,使用
coral source add --file ./my-source.yaml加载
- 创建独立的源规范,例如
- 为 Coral 仓库贡献:
- 将社区源规范写入
sources/community/<name>/manifest.yaml - 仅当用户有意修改捆绑的核心源时,才将核心源规范写入
sources/core/<name>/manifest.yaml - 添加有代表性的
test_queries,用于对源进行基本的冒烟测试/连接检查 - 使用
coral source test <name>和仓库检查进行验证
- 将社区源规范写入
工作流
- 阅读提供方 API 文档,或检查本地数据集。
- 从一张小表和少量列开始。
- 定义:
- 源元数据
- 后端
- 基础 URL 或文件位置
- 身份验证
- 变量和密钥
- 密钥的凭据获取方式;如果提供方支持基于浏览器的设置,还要包括 OAuth
- 如果要编写单独的
kind: identity清单,则定义身份设置输入和 OAuth 方法配置 - 表
- 用于源范围内参数化端点的表函数
- 筛选器
- 响应提取
- 分页
- 类型化列
- 对源规范运行 lint 检查:
coral source lint <path>
- 在合适的模式下验证源:
- 独立规范:运行
coral source add --file <path>,并使用coral sql检查 - 默认情况下,
coral source add以非交互方式运行:每个输入key都从对应的环境变量读取。运行前请导出必需的变量和密钥,或传入--interactive以接受提示。 - 对于 OAuth 凭据方法,运行
coral source add --interactive --file <path>,且不要为目标密钥设置环境变量,这样 Coral 才会提供编写的凭据选项 - 仓库源或已有名称的源:运行
coral source test <name>
- 独立规范:运行
- 检查公开的结构:
- 检查
coral.tables,查看可见表、描述、指南和必需筛选器;使用LIMIT/OFFSET限制元数据查询的范围 - 检查
coral.table_functions,查看源范围内的函数、描述、指南、参数、结果列、类型和搜索限制 - 检查
coral.columns,查看规范列元数据,包括is_virtual和is_required_filter;按单个表筛选,或对大型列集合分页 - 检查
coral.filters,查看规范化的表筛选器名称、类型、模式、必需标记和描述 - 检查
coral.inputs,验证变量、密钥、默认值、提示和必需标记
- 检查
- 使用
coral sql查询有代表性的表。 - 如果依赖
coral source test,请确保test_queries能对源进行基本的冒烟测试/连接检查。 - 完善规范并重复以上步骤。
编写规则
- 从小处着手,逐步扩展表覆盖范围。
- 将源清单架构既用作编写灵感,也用作结构验证依据:https://github.com/withcoral/coral/blob/main/crates/coral-spec/src/schema/source_manifest.schema.json
- 使用源变量配置非机密设置。
- 使用源密钥存储凭据。
- 对于基于 OAuth 的服务,使用
inputs.<TOKEN>.credential.methods[]并设置type: oauth来建模设置流程;运行时的auth或请求标头应指向同一个密钥输入。 - OAuth 凭据方法支持设备码、授权码和客户端凭据流程。对于授权码流程,设置
flow.type: authorization_code,明确将flow.pkce设置为required或disabled,使用http://127.0.0.1或http://localhost环回重定向 URI;对于允许使用可变 localhost 端口的提供商应用或动态客户端注册端点,选择redirect_uri_port_mode: random;仅当用户可以注册确切的非零重定向 URI 时,才选择fixed。如果浏览器无法访问运行 Coral 的机器,CLI 也接受用户粘贴到终端中的最终环回重定向 URL,因此不要仅因用户可能通过 SSH、在 VM 中或在浏览器与运行环境分离的环境中运行 Coral,就拒绝授权码 OAuth。对于设备码流程,声明flow.type: device_code、endpoints.device_authorization_url、endpoints.token_url,以及公共客户端 ID 或client.dynamic_registration;省略重定向 URI 字段,也不要声明静态客户端密钥。对于客户端凭据流程,声明flow.type: client_credentials、endpoints.token_url、client.id.input、client.secret.input和client.secret.transport;省略重定向 URI 字段、授权端点、设备授权端点、PKCE 和动态客户端注册。 - 如果授权码或设备码提供商支持 OAuth 动态客户端注册,优先使用
client.dynamic_registration.registration_url,而不是硬编码共享的公共客户端 ID。Coral 始终注册原生客户端;源规范无法配置web类型的动态客户端注册应用。将token_endpoint_auth_method设置为none、client_secret_basic或client_secret_post,以匹配注册的客户端类型。仅当提供商支持为客户端注册刷新令牌授权时,才将request_refresh_token_grant: true。对于受 OAuth 保护的 Streamable HTTP MCP 服务,如果提供商要求资源指示符,则将oauth.resource设置为 MCP 服务 URL。 - OAuth URL 字段可以使用
{{input.KEY}}模板化已声明的kind: variable输入,用于租户 ID 或域名等非机密端点组件。这包括endpoints.*、resource和client.dynamic_registration.registration_url。不要在 OAuth URL 中引用密钥输入、筛选器、函数参数、状态或内联默认值。 - 如果提供商也支持手动粘贴令牌,则在 OAuth 方法后添加
type: source_config回退方法。当提供商的令牌端点要求使用客户端密钥进行客户端身份验证时,请提示用户提供两个 OAuth 客户端值:声明client.id.input、client.secret.input和client.secret.transport(basic_auth或request_body)。 - 不要仅为 OAuth 客户端凭据添加顶层源输入;
client.id.input和client.secret.input会在 OAuth 设置期间收集。 - 在
kind: identity清单中,将提供商issuer、身份type、设置输入、OAuth URL、客户端 ID 和客户端密钥放在身份规范本身中。身份 OAuthclient.id可以使用default、变量input,或两者兼用;client.secret.input必须引用已声明的密钥输入。OAuth URL 模板只能引用已声明的变量输入。身份输入不得声明源凭据方法。 - 每种凭据方法都可以选择性地包含
label、description和hint字段,这些字段会在交互式安装期间以及生成的源文档中展示。当某个输入提供多种方法时,应将获取方式说明放在每种方法各自的hint中(显示在该方法的字段旁),而不是放在一个冗长的输入级hint中,并且每条提示都应仅针对该方法收集的输入。 - 对于有效期较短的 OAuth 访问令牌,请确保授权码或设备码方法在提供商支持时能够获取刷新令牌,并记录获取刷新令牌所需的任何范围、许可提示或客户端设置。当提供商返回可用的
expires_in元数据时,客户端凭据方法会根据存储的客户端元数据重新签发访问令牌;如果没有此元数据,用户必须在令牌过期后重新连接。如果其他 OAuth 方法不会签发刷新令牌,请指出访问令牌过期后用户必须重新连接,除非该源支持其他长期有效的凭据途径。 - 表和表函数名称应保持稳定、符合 SQL 命名习惯,并且在源的大小写不敏感关系命名空间中唯一。优先使用普通的
snake_case表名。表函数名称必须以 ASCII 字母或下划线开头,后续只能使用 ASCII 字母、数字或下划线。 - 仅当 API 确实要求时,才将筛选器标记为必需。
- 对于带参数的非检索操作(例如限定范围的子集合、时间范围日志、指标查询,或无法清晰映射到稳定表的详情操作),使用默认表函数。
- 对于接受查询文本并返回排序候选项的提供商端点,使用
kind: search表函数。 - 如果提供商参数的类型不是字符串,则设置表函数参数的
type;省略参数类型时,默认使用Utf8。 - 不要将提供商搜索建模为表筛选器。仅对普通的提供商端子串筛选使用
mode: contains。提供商排序检索应使用kind: search函数。 - 为每个
kind: search函数添加search_limits,并公开稳定的结果标识符,以供后续详情查询使用。 - API 结构已知时,优先使用显式分页。
- 使用实际行获取来验证分页,而不仅仅依赖
COUNT(*)。 - 需要让
coral source test执行基本的冒烟测试或连接检查时,添加或更新test_queries。
元数据 UX 规则
使用这些规则编写顶层源元数据,以确保源发现和设置过程一致。
description
- 以
Query ...开头。 - 第一句突出能力:列出用户可以查询的关键实体。
- 建议使用以下模板:
Query <entities> from <Provider> (<Cloud or self-hosted when relevant>).
description应聚焦数据覆盖范围,而非设置步骤。- 不要使用含糊的措辞,例如:
REST API v3OpenAPI provider... and more
- 将身份验证、设置和权限详情放到输入提示中,不要写在描述文本里。
输入提示(inputs.<KEY>.hint)
每条提示都应说明:
- 需要什么值
- 如何获取该值
- 最低限度的范围/权限要求
- 适用时提供一个具体格式/示例
具体指导:
- 对于 URL/基础 URL 输入:
- 说明默认值的含义
- 至少提供一个具体示例
- 支持可自托管部署时,提供相关指导
- 对于密钥:
- 明确凭据的具体类型(API 密钥、PAT、应用密钥等)
- 适用时说明格式限制(例如令牌前缀)
- 提供最小权限范围建议
- 对于 OAuth 方法:
- 使用面向用户的
label,例如Connect with GitHub description应为简短的一句话说明;将设置详情放入该方法的hint- 在该方法的
hint中列出所需的 OAuth 范围,并说明用户是否必须注册固定的回环重定向 URI,或提供自己的 OAuth 客户端 ID/密钥;当该方法收集client.id.input/client.secret.input时,说明这些值的获取方式 - 对于授权码流程,在该方法的
hint中说明:如果浏览器无法直接访问 Coral 的回环监听器,用户可以将最终的 localhost 重定向 URL 粘贴到终端 - 当某个密钥提供多种方法时,每种方法的
hint只应涵盖该方法收集的输入,不要在一个宽泛的输入级提示中混合所有方法的指导
- 使用面向用户的
- 优先使用稳定的文档链接。
- 使用官方文档链接和稳定的设置页面。
- 避免将容易失效的点击路径说明作为主要指导。
提示应简洁且可直接执行。
验证流程
编写时使用以下流程:
# Export any required inputs first (key matches the input `key` in the spec),
# or pass --interactive to be prompted.
coral source lint ./my-source.yaml
coral source add --file ./my-source.yaml
coral source test my_source
coral sql "SELECT catalog_name, schema_name, table_name, description, required_filters FROM coral.tables WHERE schema_name = 'my_source' OR catalog_name = 'my_source' ORDER BY catalog_name, schema_name, table_name LIMIT 50 OFFSET 0"
coral sql "SELECT function_name, kind, arguments_json, result_columns_json, search_limits_json FROM coral.table_functions WHERE schema_name = 'my_source' ORDER BY function_name LIMIT 50 OFFSET 0"
coral sql "SELECT table_name, filter_name, filter_mode, is_required, data_type, description FROM coral.filters WHERE schema_name = 'my_source' OR catalog_name = 'my_source' ORDER BY table_name, filter_name LIMIT 100 OFFSET 0"
coral sql "SELECT table_name, column_name, data_type, is_virtual, is_required_filter, filter_mode, description FROM coral.columns WHERE schema_name = 'my_source' OR catalog_name = 'my_source' ORDER BY table_name, ordinal_position LIMIT 100 OFFSET 0"
coral sql "SELECT catalog_name, key, kind, value, default_value, hint, required, is_set FROM coral.inputs WHERE schema_name = 'my_source' OR catalog_name = 'my_source' ORDER BY key"
每个 WHERE 子句都会同时匹配两个限定字段,因为源通过架构或目录进行寻址。通过架构寻址的源会将源名称存储在 schema_name 中,并将 catalog_name 留空;数据库源则会将源名称存储在 catalog_name 中,其 coral.inputs 行的 schema_name 为空。
对于数据库源,仅按 schema_name 筛选会返回零行而不报告错误,给人的感觉就像“此源未声明任何内容”。
对于仓库源或已命名的源,请添加 test_queries,用于基本的冒烟/连接检查,然后运行:
coral source test my_source
然后运行有针对性的表查询,直到源运行正常。
HTTP 源
对于基于 HTTP 的源:
- 定义
backend: http - 定义
base_url - 定义身份验证标头或其他运行时身份验证字段
- 当设置流程应提供 OAuth 或其他凭据获取方式时,为机密输入定义
credential.methods - 仅在需要时定义请求路径、查询参数和正文
- 为需要调用参数的提供商原生操作定义源级表函数
- 定义响应
rows_path - 当已知提供商的分页模式时,明确配置分页
- 定义类型化列
- 确定哪些简单查询可以确认源基本正常后,添加
test_queries
需要表结构和分页指南时,请阅读 references/http-source-checklist.md。
如果 HTTP 源使用带前缀的 Authorization 标头(例如 Authorization: Bearer <token>),请将原始令牌设为机密输入,并使用 from: bearer 定义标头:
inputs:
FOOBAR_API_TOKEN:
kind: secret
hint: Bearer token for the Foobar API.
auth:
type: HeaderAuth
headers:
- name: Authorization
from: bearer
key: FOOBAR_API_TOKEN
对于由 OAuth 提供凭据的 HTTP 源,请将凭据获取方式添加到同一个机密输入中:
inputs:
FOOBAR_API_TOKEN:
kind: secret
hint: Connect with Foobar OAuth or paste a token with read access.
credential:
methods:
- type: oauth
label: Connect with Foobar
description: Open a browser and authorize Coral to read Foobar data.
hint: |
Signs you in through Foobar and requests the `read` scope. To
use your own app, set FOOBAR_OAUTH_CLIENT_ID to its Client ID.
oauth:
flow:
type: authorization_code
pkce: required
redirect_uri: http://127.0.0.1:0/oauth/callback
redirect_uri_port_mode: random
endpoints:
authorization_url: https://foobar.example.com/oauth/authorize
token_url: https://foobar.example.com/oauth/token
client:
id:
input: FOOBAR_OAUTH_CLIENT_ID
scopes:
scope:
delimiter: space
values:
- read
- type: source_config
label: Paste token
hint: Paste a Foobar API token with read access to the data you query.
auth:
type: HeaderAuth
headers:
- name: Authorization
from: bearer
key: FOOBAR_API_TOKEN
当提供商接受完整粘贴的 API 密钥标头或 OAuth 访问令牌时,请将两种凭据输入都声明为可选机密,然后使用 from: one_of,并将完整标头值放在首位,后接 from: bearer OAuth 后备方式:
inputs:
FOOBAR_API_KEY:
kind: secret
required: false
FOOBAR_OAUTH_ACCESS_TOKEN:
kind: secret
required: false
auth:
type: HeaderAuth
headers:
- name: Authorization
from: one_of
values:
- from: input
key: FOOBAR_API_KEY
- from: bearer
key: FOOBAR_OAUTH_ACCESS_TOKEN
本地数据源
对于基于本地文件的源:
- 定义文件后端
- 定义源位置
- 如适用,定义文件选择模式
- 定义类型化列
交付内容
报告:
- 源规范路径
- 使用的 lint / add / test 命令
- 运行的验证命令
- 做出的假设
- 受阻或未经验证的端点