mcpField
G
graft

graft

github.com/schrepa开发51.0k 次安装31 周前更新
代码仓库

关于 graft

Graft 是用于创建或改进 Graft 服务、以代理模式封装 API,以及维护项目文档的技能。它涵盖应用开发和 OpenAPI 代理配置,并通过共享流程同时提供 HTTP 与 MCP 工具。

主要功能

  1. 01指导 Graft 应用开发
  2. 02通过代理或 OpenAPI 模式封装 API
  3. 03通过 HTTP 和 MCP 提供工具
  4. 04说明发现机制与框架端点
  5. 05核对当前包行为和示例

适用场景

  1. 01创建或改进 Graft 服务
  2. 02将 OpenAPI API 转为可调用工具
  3. 03使示例符合当前 Graft 行为
  4. 04检查贡献者文档与发布流程

MCP 相关

Graft 服务通过 Streamable HTTP 端点 POST /mcp 向 MCP 客户端提供配置的工具。该技能指导通过共享流程同时提供相同的 HTTP 与 MCP 工具。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/schrepa/graft --skill graft

安装后在 Claude Code 中输入/graft确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

agents/
openai.yaml
references/
app-authoring.md
proxy-openapi.md
validation-release.md

详细介绍

Graft

当任务涉及创建或优化 Graft 服务、使用 Graft 代理模式封装现有 API,或更新面向贡献者的文档和示例以匹配当前 graft 软件包行为时,请使用此技能。

产品理念

Graft 的核心价值包含三部分:

  1. 定义一次 — 定义具有名称、架构和处理程序的工具。
  2. 同时提供 HTTP 和 MCP 服务 — 通过同一服务和单一共享流水线提供(使用相同的身份验证、验证和中间件)。
  3. 自动发现 — Agent 通过 agent.json、mcp.json、llms.txt 找到工具。用户可以使用交互式文档(/docs)和 OpenAPI 规范(/openapi.json)。无需配置。

介绍 Graft 时,要先说明这三部分。展示示例时,要同时演示两种访问方式(MCP 和 HTTP),并说明服务会自动提供哪些内容。这既适用于基于源代码的应用,也适用于代理模式。

工作流

  1. 在提出更改之前,先确定模式:
  • 应用开发:createApp(...)、工具、资源、提示词、HTTP 路由、Node 或 fetch 集成。
  • 代理/OpenAPI:graft serve --openapi ... 或 graft.proxy.yaml。
  • 文档/发布维护:README、安装说明、技能、示例、贡献者检查。
  1. 使用记忆之前,先以当前仓库内容为依据:
  • 如果可以访问工具,请检查当前源代码、公开导出、CLI 命令、脚手架模板和测试。
  • 如果无法访问工具,请索取避免猜测所需的最少文件或示例。
  1. 在示例和审查中遵循当前公开契约:
  • 内联工具示例:优先使用 app.tool('name', config)。
  • 模块化工具示例:优先使用 defineTool(...) 加 app.tool(definedTool)。
  • 身份验证形式:true、['role'] 或 { roles: [...] }。
  • MCP Streamable HTTP 端点:POST /mcp。
  • 框架自动提供的端点:/.well-known/agent.json、/.well-known/mcp.json、/openapi.json、/docs、/llms.txt、/llms-full.txt、/health。
  • 完整 CLI:serve、dev、check、test、studio、install、add-tool。
  • 展示工具示例时,同时演示 MCP tools/call 调用和等效的 HTTP 请求(例如 GET /list-items?q=hello 或 POST /create-entry)。
  1. 在能显著提升准确性的地方使用工具,同时保持可移植性:
  • 如果可以访问仓库或 shell,请检查文件,并在完成更改后运行验证命令。
  • 如果无法访问仓库或 shell,请明确说明假设,并确保建议基于可见源代码或用户提供的片段。
  1. 只加载所需的参考资料:

快速示例

内联工具 — 两种访问方式
import { createApp } from '@schrepa/graft'
import { z } from 'zod'

const app = createApp()

app.tool('list_items', {
  description: 'List items matching a query.',
  params: z.object({ q: z.string() }),
  auth: true,
  handler: async ({ q }) => ({
    items: ['hello', 'world'].filter((item) => item.includes(q)),
  }),
})

export default app

MCP(tools/call):

{ "method": "tools/call", "params": { "name": "list_items", "arguments": { "q": "hello" } } }

等效 HTTP 请求:

GET /list-items?q=hello
Authorization: Bearer <token>

两种方式都会运行相同的处理程序、身份验证中间件和验证逻辑。

代理模式 — graft.proxy.yaml
target: https://petstore3.swagger.io/api/v3
tools:
  - method: GET
    path: /pet/findByStatus
    name: find_pets_by_status
    description: Find pets by status.
    parameters:
      type: object
      properties:
        status:
          type: string
  - method: POST
    path: /pet
    name: create_pet
    description: Create a pet.
    parameters:
      type: object
      properties:
        name:
          type: string
      required: [name]

启动代理服务:

graft serve --config graft.proxy.yaml

Graft 会将每个已配置的操作同时公开为 HTTP 端点和 MCP 工具,并自动生成 /openapi.json、/docs 和发现文件。

对于直接使用 OpenAPI 的方式,请使用:

graft serve --openapi ./openapi.yaml --target https://api.example.com

注意事项

  • 不要仅仅因为旧示例提到过某种行为,就记录当前不支持的行为。
  • 示例应简短且可执行;优先采用一种正确模式,而不是提供多种变体。
  • 相较于过时的笔记、博客文章或记忆,优先参考当前源代码和测试。
  • 除非正在编辑的仓库中确实存在相关内容,否则不要提及注册表或发布产物。
  • 对于可能过时的文档声明,请添加或更新自动化检查。

评论

支持 Markdown