这是一个支持内置模型上下文协议(MCP)服务器的TypeScript客户端,用于Snyk REST API。此包提供了从官方Snyk OpenAPI规范自动生成的类型安全API客户端以及用于AI助手集成的MCP服务器。
npm install
构建过程包括OpenAPI代码生成和TypeScript编译:
# 完整构建(生成+编译)
npm run prepare
# 从OpenAPI规范生成API客户端
npm run generate
# 仅编译TypeScript
npm run build
import { Configuration, OrgsApi, IssuesApi } from 'snyk-mcp-rest';
// 配置API客户端
const config = new Configuration({
apiKey: process.env.SNYK_API_KEY,
basePath: 'https://api.snyk.io/rest'
});
// 或使用辅助函数
import { createConfiguration } from 'snyk-mcp-rest';
const config = createConfiguration(process.env.SNYK_API_KEY!);
// 使用组织API
const orgsApi = new OrgsApi(config);
const orgs = await orgsApi.listOrgs({
version: '2024-11-05'
});
// 使用问题API
const issuesApi = new IssuesApi(config);
const issues = await issuesApi.listOrgIssues({
version: '2024-11-05',
orgId: 'your-org-id',
status: ['open'],
limit: 100
});
// 使用项目API根据仓库名称查找项目
const projectsApi = new ProjectsApi(config);
const projects = await projectsApi.listOrgProjects({
version: '2024-11-05',
orgId: 'your-org-id',
names: ['owner/my-repo'] // 按仓库名称过滤
});
// 获取匹配仓库的项目ID
const projectIds = projects.data.data?.map(p => p.id) || [];
// 获取特定项目的详细问题
if (projectIds.length > 0) {
const projectIssues = await issuesApi.listOrgIssues({
version: '2024-11-05',
orgId: 'your-org-id',
scanItemId: projectIds[0],
scanItemType: 'project' as any,
status: ['open']
});
}
MCP服务器为AI助手提供访问Snyk安全数据的能力。在您的AI助手(例如Claude Desktop)中进行配置:
# 开发模式(使用ts-node)
npm run mcp-server
# 生产模式(需要先构建)
npm run build
npm run mcp-server:build
使用提供的测试脚本在没有Claude Desktop的情况下测试MCP服务器:
测试get_issues工具:
# 先构建项目
npm run build
# 运行get_issues测试脚本
npx ts-node examples/get-issues.ts [project-id] [status] [severity]
# 示例:
npx ts-node examples/get-issues.ts # 所有开放的问题
npx ts-node examples/get-issues.ts 12345678-1234-1234-1234-123456789012 # 特定项目的开放问题
npx ts-node examples/get-issues.ts 12345678-1234-1234-1234-123456789012 resolved # 特定项目的已解决问题
npx ts-node examples/get-issues.ts 12345678-1234-1234-1234-123456789012 open critical # 批评性的开放问题
npx ts-node examples/get-issues.ts "" resolved high # 所有已解决的高严重性问题
get-issues.ts脚本接受与get_issues MCP工具相同的参数:
projectId - 项目ID,UUID格式(可选)status - 问题状态:open、resolved、ignored(可选,默认:open)severity - 问题严重性:low、medium、high、critical(可选)测试get_issue工具:
# 获取特定问题的详细信息
npx ts-node examples/get-issue.ts <issue-id>
# 示例:
npx ts-node examples/get-issue.ts 12345678-1234-1234-1234-123456789012
get-issue.ts脚本需要:
issue_id - 要检索的问题的唯一标识符(UUID)(必需)添加到您的Claude Desktop配置文件(macOS上的~/Library/Application Support/Claude/claude_desktop_config.json):
选项1:使用npx和ts-node(推荐用于开发)
{
"mcpServers": {
"snyk-rest-api": {
"command": "npx",
"args": [
"-y",
"ts-node",
"/绝对路径到/snyk-mcp-rest/src/mcp-server.ts"
],
"env": {
"SNYK_API_KEY": "您的snyk-api-key",
"SNYK_ORG_ID": "您的org-id-uuid",
"SNYK_ORG_SLUG": "您的org-slug"
}
}
}
}
选项2:使用编译后的JavaScript(推荐用于生产)
首先通过npm run build构建项目,然后:
{
"mcpServers": {
"snyk-rest-api": {
"command": "node",
"args": [
"/绝对路径到/snyk-mcp-rest/dist/mcp-server.js"
],
"env": {
"SNYK_API_KEY": "您的snyk-api-key",
"SNYK_ORG_ID": "您的org-id-uuid",
"SNYK_ORG_SLUG": "您的org-slug"
}
}
}
}
重要提示:用实际的绝对路径替换/绝对路径到/snyk-mcp-rest(例如/Users/yourname/Projects/snyk-mcp-rest)。
get_issues - 为组织和项目检索Snyk安全问题
projectId(可选):项目ID,UUID格式(例如"12345678-1234-1234-1234-123456789012")。status(可选):按状态过滤(open、resolved、ignored)severity(可选):按严重性过滤(low、medium、high、critical)SNYK_ORG_ID(必需):Snyk组织ID(UUID)SNYK_ORG_SLUG(必需):用于URL的组织别名get_repo_issues)明确提供,否则repository字段将为null。注意:projectId参数必须是UUID格式。要找到仓库的项目ID:
const projectsApi = new ProjectsApi(config);
const projects = await projectsApi.listOrgProjects({
version: '2024-11-05',
orgId: '您的org-id',
names: ['owner/my-repo']
});
const projectId = projects.data.data?.[0]?.id;
get_issue - 检索特定Snyk问题的详细信息
issue_id(必需):要检索的问题的唯一标识符(UUID)SNYK_ORG_ID(必需):Snyk组织ID(UUID)SNYK_ORG_SLUG(必需):用于URL的组织别名客户端提供了对所有Snyk REST API端点的访问:
...等等!更多内容请参见src/generated/api/中的完整列表。
项目包含全面的测试覆盖:
# 一次性运行所有测试
npm test
# 监视模式(更改时自动重新运行)
npm run test:watch
# 覆盖率报告
npm run test:coverage
# UI模式(交互式测试运行器)
npm run test:ui
tests/api.test.ts)- 配置、API实例化、导出(18个测试)tests/mcp-server.test.ts)- 问题检索、过滤、分页、项目名称获取(9个测试)tests/mcp-server-logic.test.ts)- 处理函数、工具模式(21个测试)tests/mcp-business-logic.test.ts)- 问题格式化、响应处理(25个测试)tests/integration.test.ts)- 多API工作流、分页处理(7个测试)tests/error-handling.test.ts)- HTTP错误、网络故障、验证(8个测试)tests/index.test.ts)- 模块导出和类型定义(14个测试)测试统计:7个测试文件中的102个测试案例,涵盖核心功能、错误场景和边缘情况。
覆盖率:总体代码覆盖率93%以上(src/index.ts为100%,src/mcp-server.ts为93%以上)。根据项目策略,生成的代码(src/generated/**)不计入覆盖率。
src/
├── generated/ # 自动生成(不要编辑)
│ ├── api/ # API类
│ ├── models/ # TypeScript接口
│ └── configuration.ts, base.ts, common.ts
├── index.ts # 主入口点 - API客户端导出
├── mcp-server.ts # MCP服务器(业务逻辑+启动脚本)
└── tools/ # MCP工具实现
├── index.ts # 工具注册表
├── types.ts # 工具类型定义
├── utils.ts # 共享实用程序
├── get-issues.ts # get_issues工具
├── get-issue.ts # get_issue工具
├── get-repo-issues.ts # get_repo_issues工具
└── find-projects.ts # find_projects工具
examples/
├── basic-usage.ts # 基本API客户端使用示例
├── get-issues.ts # MCP服务器测试脚本(get_issues工具)
├── get-issue.ts # MCP服务器测试脚本(get_issue工具)
├── get-repo-issues.ts # MCP服务器测试脚本(get_repo_issues工具)
└── find-projects.ts # MCP服务器测试脚本(find_projects工具)
tests/
├── api.test.ts # API客户端测试(18个测试)
├── mcp-server.test.ts # MCP服务器集成测试(9个测试)
├── mcp-server-logic.test.ts # MCP处理函数(21个测试)
├── mcp-business-logic.test.ts # 问题格式化逻辑(25个测试)
├── integration.test.ts # 多API工作流(7个测试)
├── error-handling.test.ts # 错误场景(8个测试)
└── index.test.ts # 模块导出(14个测试)
res/
└── snyk-openapi-2025-11-05.json # OpenAPI规范
重要提示:不要编辑src/generated/中的文件 - 它们是从OpenAPI规范自动生成的。
客户端使用Axios进行HTTP操作。适当处理错误:
import { AxiosError } from 'axios';
try {
const response = await issuesApi.listOrgIssues({
version: '2024-11-05',
orgId: '您的org-id'
});
} catch (error) {
if (error instanceof AxiosError) {
console.error('API错误:', error.response?.status);
console.error('详细信息:', error.response?.data);
} else {
console.error('意外错误:', error);
}
}
在项目根目录创建一个.env文件:
SNYK_API_KEY=您的api-key
对于MCP服务器,使用以下环境变量:
SNYK_API_KEY(必需) - 您的Snyk API令牌(从https://app.snyk.io/account获取)SNYK_ORG_ID(必需) - 您的Snyk组织ID(UUID格式)SNYK_ORG_SLUG(必需) - 您的Snyk组织别名用于URL(例如my-org)您可以在Snyk Web UI的组织设置下找到您的组织ID和别名。
2024-11-05(所有API调用都需要version参数)snyk-openapi-2025-11-05.json生成代码生成通过openapitools.json配置:
typescript-axios./src/generatedMIT
https://github.com/axelspringer/snyk-mcp-rest
src/generated/)npm test以验证更改