mcp辛烷
早期阿尔法 --该项目正在积极开发中,尚未准备好投入生产。API、工具模式和行为可能会更改,恕不另行通知。使用风险自负。
A. 模型上下文协议 (MCP)服务器,它公开OpenText ALM Octane实体作为LLM消费的工具。在单个Octane工作区中为故事、功能、史诗、缺陷、任务、发布和工作项提供读取和更新操作。
特性
- 7种实体类型的21个MCP工具(获取、列出、更新)
- 基于Cookie的会话身份验证,到期时自动重新身份验证
- 通过自动进行乐观锁定
version_stamp处理更新 - Octane查询语法支持过滤和搜索
- 每个实体类型的默认字段预测,以保持响应的重点
- 带请求跟踪的结构化JSON日志记录
需求
- 转到1.25+
- 访问OpenText ALM Octane实例
- API密钥凭据或用户名/密码
安装
go install github.com/roygabriel/mcp-opentext-octane@latest或者从源代码构建:
git clone https://github.com/roygabriel/mcp-opentext-octane.git
cd mcp-opentext-octane
make build配置
配置是从环境变量加载的。可选 .env 文件支持通过 godotenv.
| 变量 | 必填 | 描述 |
|---|---|---|
OCTANE_URL | 是 | 基本URL(例如。, https://octane.example.com) |
OCTANE_SHARED_SPACE_ID | 是 | 共享空间ID(数字) |
OCTANE_WORKSPACE_ID | 是 | 工作区ID(数字) |
OCTANE_CLIENT_ID | 否\* | API密钥客户端ID |
OCTANE_CLIENT_SECRET | 否\* | API密钥客户端机密 |
OCTANE_USERNAME | 否\* | 用户登录名 |
OCTANE_PASSWORD | 否\* | 用户密码 |
LOG_LEVEL | 否 | 日志记录级别: DEBUG, INFO (默认), WARN, ERROR |
\*要么 CLIENT_ID + CLIENT_SECRET 或 USERNAME + PASSWORD 必须提供。首选API密钥身份验证。
示例 .env
OCTANE_URL=https://octane.example.com
OCTANE_SHARED_SPACE_ID=1001
OCTANE_WORKSPACE_ID=2001
OCTANE_CLIENT_ID=my_api_client_id@internal
OCTANE_CLIENT_SECRET=my_secretMCP客户端配置
克劳德桌面/克劳德代码
添加到MCP设置中:
{
"mcpServers": {
"octane": {
"command": "/path/to/mcp-opentext-octane",
"env": {
"OCTANE_URL": "https://octane.example.com",
"OCTANE_SHARED_SPACE_ID": "1001",
"OCTANE_WORKSPACE_ID": "2001",
"OCTANE_CLIENT_ID": "my_api_client_id@internal",
"OCTANE_CLIENT_SECRET": "my_secret"
}
}
}
}工具
实体类型
| 实体 | 获取 | 列表 | 更新 |
|---|---|---|---|
| 用户故事 | get_story | list_storys | update_story |
| 特点 | get_feature | list_features | update_feature |
| Epic | get_epic | list_epics | update_epic |
| 缺陷 | get_defect | list_defects | update_defect |
| 任务 | get_task | list_tasks | update_task |
| 释放 | get_release | list_releases | update_release |
| 工作项目 | get_work_item | list_work_items | update_work_item |
获取
按ID检索单个实体。
参数:
id(数字,必填)——实体IDfields(字符串,可选)--逗号分隔的字段名。省略使用实体特定的默认值
列表
通过过滤、排序和分页来搜索和列出实体。
参数:
query(string,可选)--辛烷值查询筛选器(请参见 查询句法)fields(字符串,可选)--逗号分隔的字段名。省略使用实体特定的默认值order_by(字符串,可选)--要排序的字段名。前缀为-用于下降limit(数字,默认值:50)--返回的最大结果数(1-200)offset(number,默认值:0)--分页时要跳过的结果数
更新
更新现有实体上的字段。版本控制(version_stamp)是自动处理的。
参数:
id(数字,必填)——实体IDfields(object,必填)--将字段名转换为新值的对象
不可变字段 (无法更新): id, type, subtype, creation_time, last_modified, version_stamp, workspace_id, logical_name, invested_hours
查询句法
这 query 参数使用Octane的原生查询语言:
| 模式 | 描述 | 示例 | ||||
|---|---|---|---|---|---|---|
field='value' | 完全匹配 | name='Login bug' | ||||
field='val*' | 通配符匹配 | name='Login*' | ||||
field={ref.value} | 参考匹配 | phase={phase.new} | ||||
; | 以及 | phase={phase.new};priority={list_node.priority.high} | ||||
| `\ | \ | ` | 或 | `phase={phase.new}\ | \ | phase={phase.open}` |
field={null} | 空检查 | owner={null} | ||||
field>='date' | 日期比较 | creation_time>='2024-01-01T00:00:00Z' |
最大查询长度:2000个字符。
参考场
引用字段是JSON对象,具有 id 和 type 物业。它们用于更新指向其他实体的字段。
// Set phase
{"phase": {"id": "phase.new", "type": "phase"}}
// Set priority
{"priority": {"id": "list_node.priority.critical", "type": "list_node"}}
// Assign owner (workspace user)
{"owner": {"id": 5001, "type": "workspace_user"}}
// Assign to sprint
{"sprint": {"id": 2001, "type": "sprint"}}
// Clear a field
{"sprint": null}每个实体的默认字段
时中 fields 如果省略参数,则每种实体类型都会返回一组精心策划的默认字段:
| 实体 | 默认字段 |
|---|---|
| 故事 | id、名称、阶段、优先级、故事_点、所有者、功能、发布、里程碑、冲刺、团队、被阻止、被阻止原因、排名、项目起源、描述、创建_时间、最后修改 |
| 特征 | id、名称、阶段、优先级、史诗、发布、里程碑、排名、所有者、描述、创建时间、最后修改时间 |
| Epic | id、名称、阶段、发布、所有者、描述、创建时间、最后修改时间 |
| 缺陷 | id、名称、阶段、优先级、故事点、所有者、功能、发布、里程碑、冲刺、团队、被阻止、被阻止原因、排名、项目起源、描述、创建时间、最后修改 |
| 任务 | id、名称、阶段、所有者、backlog_item、sprint、团队、估计小时数、剩余小时数、投资小时数、阻塞、阻塞原因、描述、创建时间、最后修改时间 |
| 发布 | id、名称、开始日期、结束日期、创建时间、最后修改时间 |
| 工作项 | id、名称、子类型、阶段、优先级、所有者、发布、冲刺、团队、creation_time、last_modified |
码头工人
使用Docker构建和运行:
# Build
docker build -t mcp-opentext-octane:latest .
# Or via Makefile
make docker图像使用a 无发行版 非根基,攻击面最小。
发展
先决条件
安装开发工具:
make tools这将安装 golangci-lint 和 govulncheck.
命令
| 命令 | 描述 |
|---|---|
make all | 跑兽医、剪毛、测试和构建 |
make build | 构建二进制文件 |
make test | 运行具有种族检测和覆盖的测试 |
make cover | 生成HTML覆盖率报告 |
make vet | 快跑 go vet |
make lint | 快跑 golangci-lint |
make vuln | 快跑 govulncheck |
make run | 构建并运行 |
make docker | 构建Docker镜像 |
make clean | 删除二进制文件和覆盖率文件 |
项目结构
mcp-opentext-octane/
├── config/
│ ├── config.go # Environment-based configuration
│ └── config_test.go
├── octane/
│ ├── client.go # HTTP client with auth and retry
│ ├── client_test.go
│ └── types.go # Entity, EntityList, QueryParams, constants
├── tools/
│ ├── interfaces.go # OctaneReader, OctaneWriter, OctaneService
│ ├── handlers.go # Generic handler factories (get, list, update)
│ ├── handlers_test.go
│ ├── mock_test.go # MockOctaneService for testing
│ ├── validate.go # Input validation
│ └── validate_test.go
├── main.go # Tool registration, middleware, server setup
├── middleware_test.go
├── Makefile
├── Dockerfile
├── .golangci.yml
└── sonar-project.properties建筑
- 通用处理程序模式 --三个处理器工厂(
GetEntityHandler,ListEntitiesHandler,UpdateEntityHandler)提供所有7种实体类型,由实体类型字符串参数化 - 动态实体模型 --辛烷有4500多个可能的字段。实体使用
map[string]interface{}每个类型都有默认的字段投影,而不是类型化结构 - Cookie会话身份验证 --在第一次请求时延迟身份验证,存储
LWSSO_COOKIE_KEY在cookie罐中,对401个响应重试一次 - 乐观锁定 --更新执行GET,然后执行PUT以获取当前
version_stamp,防止过时数据冲突 - 可测试性 --外部依赖关系位于接口后面(
OctaneReader,OctaneWriter,HTTPBackend)用于使用模拟进行单元测试
持续集成
GitHub Actions在推送模式下运行 main/dev 对于pull请求:
- 测试 —
go vet,使用种族检测器进行测试,80%覆盖率门 - 棉绒 —
golangci-lint(错误检查、政府、统计检查、未使用、无效分配、gosec、gocritic) - 漏洞扫描 —
govulncheck - 构建 --取决于测试和棉绒通过情况
Dependabot配置为每周更新Go模块和GitHub操作。
许可证
看 许可证 了解详情。
