openstack-incidents
Supports an LLM-driven investigation mode using any OpenAI Chat Completions-compatible model service, with tool whitelisting, step limits, timeouts, and trace logging.
Provides tools for investigating OpenStack VM instances using Loghub OpenStack logs, including instance summaries, log search, timeline reconstruction, runbook retrieval, evidence validation, and incident ticket drafting.
Provides read-only log querying and timeline reconstruction against OpenStack logs indexed in PostgreSQL, enabling evidence-backed investigation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@openstack-incidentsinvestigate OpenStack instance 544fd51c-4edc-4780-baae-ba1d80a0acfc and draft an incident report"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AIOps 日志故障调查与工单辅助 Agent
这是一个可以本地复现的 Agent 工程:输入 OpenStack 虚拟机实例 ID,可选请求 ID(req-<UUID>)。
省略请求 ID 时按日志时间选择该实例最新的有效请求,指定后则严格使用指定请求。
Agent 在解析后固定的操作范围内调用日志工具,跨日志分区重建时间线、提出候选故障假设、
核对同一请求的成功事件、校验日志引用,最后输出一份必须由人工确认的工单草稿。
项目使用公开的 Loghub OpenStack 数据。它不是自动修复系统,也不会把公开数据的“异常实例标签” 夸大成逐行根因标签。
项目包含什么
Agent Harness:统一驱动“决策—工具—观察”循环,限制最大步骤、总超时、单工具超时、 重试、重复调用和工具白名单,并保存 JSONL Trace。
Skills:把日志分诊、证据核验、报告生成写成三个可复用的工作方法;离线策略和 LLM 策略加载同一组 Skill。
工具与 MCP 封装:Agent 内部默认直接调用同进程 Tool Registry,避免每次启动 MCP 子进程。 LLM 使用模型原生 Function Calling 选择工具,Harness 校验白名单及固定的实例/请求范围后执行。 MCP Server 供外部客户端使用;配置切为
mcp时,内部先发现工具 Schema,再复用一个 stdio 会话调用同一套实现。 工单写入工具不在 Agent Harness 白名单内,外部调用者必须显式传入approved=true。双运行模式:
heuristic不需要 API Key,可稳定演示和作为基线;llm支持任何兼容 OpenAI Chat Completions 的模型服务。LLM 模式强制先检索日志和 Runbook,再生成报告。可溯源 RAG:将 Markdown Runbook 按检查项切块,用 BM25 排序,检索片段及来源进入模型上下文; 报告分别列出经过校验的日志引用和 Runbook 指南引用。后者只用于建议,不作为故障发生的证据。
上下文与长期记忆:LLM 只接收有长度上限的当前摘要、重点事件、有效引用和检索片段; 显式批准的工单草稿以 JSONB 写入 PostgreSQL,只读取相同实例/请求最近两条历史记录,且不作为当前证据。
可复现评测:评测器单独读取实例标签,逐请求调查后聚合为实例结果;不存在请求级金标,旧实例级指标不能直接沿用。原始引用仍含分区名,因此小规模冒烟评测并非严格盲测。
可观测接口:CLI、FastAPI 和 MCP 共用同一个工具注册模块,不复制业务逻辑。
Related MCP server: agent-mcp-workflow-platform
一次任务如何运行
告警/实例 ID + 可选请求 ID
│
▼
入口解析范围(指定请求 / 按日志时间选择最新有效请求)
│
▼
Agent Policy(LLM 原生 Function Calling / 无 Key 规则基线)──加载──> Skill 工作方法
│
▼
Harness(锁定实例/请求范围、步数、超时、重试、循环熔断、白名单、Trace)
│
▼
本地 Tool Registry(默认) / MCP Client → MCP Server(可选)
│
├── PostgreSQL 日志索引(只读查询)
├── Runbook 检索
├── 引用校验
└── PostgreSQL 已批准工单记忆
│
▼
带证据与反证的调查报告Harness 不是需要单独下载的神秘框架,而是本项目自己实现的 Agent 运行底座。它不负责判断业务
结论,负责保证 Agent 在规定权限和预算内运行。Skill 是可加载的工作流程知识;MCP 是让本项目
Agent 和其他客户端发现、调用工具的协议。这三者的职责互不替代。
LLM 模式的 RAG 链路为:实例摘要与时间线检索 → Runbook 检查项检索 → 日志引用校验 →
将检索片段交给模型生成报告 → 核对报告引用确实来自本次检索。Runbook 目前只有 3 份短文档,
因此使用本地 BM25 分块检索即可;向量数据库、Embedding 和重排会增加依赖与维护成本,
当前数据规模下没有足够收益。heuristic 模式保留为无 Key 的规则对照,不应与 LLM RAG 效果混称。
快速开始(Windows PowerShell)
cd D:\yolo\rag\aiops-incident-investigation-agent
docker compose up -d postgres
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -e ".[all]"
# 若 data/raw 已有四个文件,可跳过下载
.\scripts\download_data.ps1
# 把约 20.8 万行日志导入 PostgreSQL 并建立索引
incident-agent prepare
# 不使用任何模型 API 的完整演示
# 不填请求 ID:调查该实例最新一次请求
incident-agent investigate 544fd51c-4edc-4780-baae-ba1d80a0acfc
# 指定请求 ID:调查这一次虚拟机构建
incident-agent investigate 544fd51c-4edc-4780-baae-ba1d80a0acfc req-d6143bd4-9784-4e95-a0c8-83fba00530b6
# 小规模、标签隔离的评测
incident-agent evaluate
# 测试
pytest -q默认开发连接为 postgresql://incident:incident_dev_password@127.0.0.1:55432/incident_agent,
仅供本机演示。实际部署请修改数据库密码,并通过 AGENT_DATABASE_URL 环境变量注入连接串;
不要将真实密码提交到仓库。prepare 重复运行会复用已有完整索引;仅在需要重建时使用
incident-agent prepare --force。原来的 data/processed/*.db 文件不会被读取,数据会从
data/raw/ 重新导入 PostgreSQL。
升级后运行一次 incident-agent prepare 即可为已有日志表补建
(instance_id, request_id, timestamp, dataset, line_no) 联合索引;无需 --force 或重新导入数据。
指定的两个 ID 必须来自同一次操作。请求 ID 可从该实例日志中的 req-... 取得,输入格式错误会被拒绝。
“最新”按这个实例各请求最后一条有效时间戳倒序选择,时间相同时按请求 ID 稳定排序;
不是按当前日期,也不保证最新请求就是创建请求(它也可能是删除、重启等)。想复现构建异常时请明确指定构建请求。
没有有效时间戳和请求 ID 时返回范围无法确定的错误,不会退回查询整个实例历史。
Agent 内部默认使用 AGENT_TOOL_TRANSPORT=local:从 Tool Registry 读取工具 Schema,筛选白名单后
提供给模型,模型仍通过原生 Function Calling 选择工具;同步执行通过工作线程避免占住异步线程。
同进程无需工具服务隔离时,这条路径省去 stdio 子进程启动、序列化和通信往返,但实际延迟收益尚未测量。
需要通过独立工具服务运行时可设 AGENT_TOOL_TRANSPORT=mcp:每次调查启动一个 stdio MCP Server,
初始化后通过 list_tools 发现定义,复用会话并通过 call_tool 执行,结束时关闭。
两条路径共用业务实现和 Harness 范围护栏,模型均接收所选路径的工具 Schema。
FastAPI 接收业务调查请求;MCP 对接外部 AI 工具客户端。
如果只使用 Docker,也可以在下载数据后运行:
docker compose up -d postgres
docker compose run --rm incident-api incident-agent prepare
docker compose up -d incident-api本次创建项目时已经下载并校验数据;归档 MD5 为
66bd42c07837a094d9b0ea2d036b5713。原始日志被 .gitignore 排除,不应上传到 GitHub。
使用大模型模式
复制 .env.example 中需要的变量到当前终端或安全的环境配置中,不要把 Key 写入代码:
$env:AGENT_MODEL_MODE = "llm"
$env:AGENT_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
$env:AGENT_API_KEY = "你的 Key"
$env:AGENT_MODEL = "qwen-plus"
incident-agent investigate 544fd51c-4edc-4780-baae-ba1d80a0acfc req-d6143bd4-9784-4e95-a0c8-83fba00530b6 --mode llmLLM 只能选择 Harness 白名单中的只读工具。模型返回格式错误、工具失败、超时或陷入重复调用时, Harness 会记录 Trace 并返回稳定的失败状态,而不是无限循环。 模型漏传/改换任一 ID 的工具调用会被 Harness 阻止。报告若引用未经校验或不属于该请求的日志、 未检索到的 Runbook 片段,或取消人工复核,也会被拒绝;反证引用也必须经过相同的范围校验。 每次运行的完整工具轨迹仍保留在 JSONL Trace 中;缩短模型上下文不会删除审计记录。
上下文分两层:本次调查的工具观察保留在 Harness 中,交给 LLM 前由 ContextManager 按约
12,000 字符预算筛选实例摘要、异常/首尾事件、近两次日志搜索、已校验引用和 Runbook 片段;
历史层只查询 PostgreSQL approved_case_memory 中相同实例和请求、最近两条已批准记录。
该表的 report 为 JSONB,并对 (instance_id, request_id, approved_at DESC) 建索引。历史仅供参考,
当次结论仍必须由当次日志引用支持;评测标签不会进入上下文。旧的本地 JSON 草稿不再用于记忆。
记忆表在首次读写时自动补建 request_id 列和新索引;旧记录保留,但未关联请求的旧记录不进入当前上下文。
启动 FastAPI
uvicorn incident_agent.api:app --reload --port 8000接口:
GET /healthPOST /v1/investigationsSwagger:
http://127.0.0.1:8000/docs
请求示例:
{
"instance_id": "544fd51c-4edc-4780-baae-ba1d80a0acfc",
"request_id": "req-d6143bd4-9784-4e95-a0c8-83fba00530b6",
"mode": "heuristic"
}也可省略 request_id(或传 null),自动调查该实例最新的有效请求:
{"instance_id": "544fd51c-4edc-4780-baae-ba1d80a0acfc", "mode": "heuristic"}入口先解析并锁定请求,再按 instance_id AND request_id 搜索全部已索引分区;报告包含实际使用的两个 ID,dataset 字段为 all,
而每条证据仍使用原始的 分区:行号(例如 abnormal:11983)定位日志。
匹配不到这对 ID 时报告为 uncertain,不会放宽为实例全部历史,也不会凭空判断故障。
没有请求 ID 的日志不会自动归入该请求,可能导致缺少耗时或完成事件;报告会保留这个限制。
时间线按限额保留同一请求的首尾事件,可能省略中间过程,可由模型通过同范围日志搜索补查。
这不是额外的“最近 24 小时”过滤;范围由请求 ID 确定,跨服务本地请求 ID 不同的情况仍需显式关联。
启动 MCP Server
incident-mcp这是供外部 MCP 客户端使用的 stdio Server,也可在内部启用 mcp 模式。客户端配置示例:
{
"mcpServers": {
"openstack-incidents": {
"command": "D:\\yolo\\rag\\aiops-incident-investigation-agent\\.venv\\Scripts\\incident-mcp.exe"
}
}
}提供的工具:
get_instance_summarysearch_logsget_timelinesearch_runbooksget_case_memoryvalidate_evidencesave_ticket_draft
评测标签没有注册为工具,因此 Agent 无法在运行时偷看答案。
日志、时间线、记忆和证据核验工具均要求 instance_id 与 request_id。Runbook 是通用指南,
其检索无需两个 ID;工单保存从报告中读取并验证两个 ID。
get_case_memory 只读取 PostgreSQL 中相同实例/请求已批准的工单记录;普通调查不会自动写入。
命令行的 --approve-ticket 或外部 MCP 调用的显式 approved=true 才会写入。
当前批准标记只是操作门槛,不是企业身份认证;正式接入生产流程仍需身份校验和审批审计。
评测口径
默认评测包含 4 个官方异常实例和从 normal2 抽取的 50 个正常实例;normal1 只用于建立
正常构建耗时基线,避免让同一批正常样本同时参与阈值校准和测试。评测输出:
Precision、Recall、F1:枚举每个实例的请求分别调查,任一请求判异常则标记该实例,按实例标签评分;
Evidence validity:证据与反证引用是否真实存在,并同时对应当前实例和请求;
Completion rate、平均步骤数和延迟:以单次请求调查为单位;另列实例完成率和请求覆盖率。
标签只有实例级,没有请求级或逐行根因金标。没有请求标记的实例列为未覆盖/不确定,而非正常。
新结果另存 evaluation-request-scoped-<mode>.json,旧的 evaluation-<mode>.json 仅作历史记录。
本次接口升级没有重跑评测;docs/BAD_CASE_REPORT.md 中旧版数值不代表请求级版本效果。
这只是工程冒烟评测,样本很少,不能据此宣称生产准确率或根因诊断准确率。要形成可用于简历的 正式指标,应冻结更大的实例级测试集,人工标注“证据是否支持结论”,并至少重复运行 LLM 模式 三次,报告均值、标准差、成本和 Bad Case 分类。
评测结果保存在 artifacts/evaluations/,运行轨迹保存在 artifacts/traces/。
失败与安全边界
调查按实例 ID 与请求 ID 联合过滤,跨三个已索引分区查询,单次最多返回 100 条日志;
Harness 限制最大 8 步、总耗时 45 秒、单工具 8 秒;
同一个工具和参数重复超过阈值会熔断;
工具错误进行有限指数退避重试;
证据与反证要求
dataset:line引用,并在结束前核验实例及请求归属;工单草稿默认拒绝落盘,必须由调用者显式批准;
项目不执行重启、扩缩容、网络修改等生产操作。
数据来源与许可
数据来自 Loghub 的
OpenStack 数据集,归档发布于
Zenodo。官方说明数据包含正常日志和故障注入场景;
anomaly_labels.txt 只列出 4 个异常 VM 实例。Loghub 数据仅明确允许研究/学术用途并要求引用,
许可全文见 data/LICENSE-LOGHUB.txt。
项目代码采用 MIT License;代码许可不改变数据集自身的使用条件。
目录结构
src/incident_agent/
application.py # 依赖装配的唯一入口
harness.py # Agent 运行、护栏、重试和 Trace
policies.py # 离线策略与 OpenAI-compatible LLM 策略
tools.py # 所有调用方式共用的工具注册模块
logstore.py # 日志解析、PostgreSQL 索引和受限查询
mcp_client.py # Agent 内部复用的 stdio MCP 客户端
mcp_server.py # MCP 工具服务
memory.py # PostgreSQL 已批准工单记忆
api.py # FastAPI adapter
evaluation.py # 标签隔离的评测器
skills/ # 三个可加载 Skill
knowledge/ # Runbook 知识
tests/ # Parser、工具、Harness、Skill 测试
data/ # 原始数据和数据说明(数据库由 Docker Volume 保存)
artifacts/ # Trace、评测结果;已批准工单存 PostgreSQL本项目真正实现的部分
公开数据只提供日志和异常实例标签。本项目实现的是日志解析与索引、Agent Harness、Skill 加载、 工具权限控制、MCP/FastAPI adapters、证据校验、人工审批门、评测与 Trace。面试时应把公开数据来源 和自己的实现分别说明,不把数据集或第三方 SDK 当成自己的代码。
Available Tools
7 toolsget_case_memoryB
Read approved drafts for this instance/request pair as historical context.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| request_id | Yes | ||
| instance_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does add one meaningful behavioral fact beyond the schema: only *approved* drafts are returned, implying unapproved ones are filtered out. It says nothing about ordering, pagination, or how the limit truncates results, which is a notable omission for a read tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and scope appear before the purpose. It is efficient, though arguably too terse given the documentation gaps it leaves behind.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required. However, with zero schema coverage, no annotations, and an undefined `limit` default of 2, the description is too thin for an agent to know what it will receive or how results are bounded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters. The phrase 'instance/request pair' loosely maps to instance_id and request_id, but the `limit` parameter (with default 2) is never explained in either the schema or the description, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (approved drafts) scoped to an instance/request pair, with the intent (historical context) made explicit. It is distinguishable from siblings like get_instance_summary or get_timeline by the 'approved drafts' resource, though it never names an alternative directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'as historical context' implies the situation that motivates the call (looking for precedent), but there is no explicit when-to-use, when-not-to-use, or guidance on choosing this over get_instance_summary/get_timeline. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instance_summaryC
Return signals only for the specified instance/request pair.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes | ||
| instance_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. The word "only" hints at a scoped subset of data, but there is no disclosure of permissions, rate limits, or how incomplete data is handled, and no output schema is needed here but the description still says nothing useful about behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no wasted words, but its brevity reflects under-specification rather than efficient communication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and there are no annotations to contradict. Still, for a read tool with two undocumented params, the description leaves an agent guessing what it actually retrieves and when it applies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only source of parameter meaning. It names the "instance/request pair," which loosely maps to the two required params, but adds no format, ID provenance, or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a verb ("Return") and a scope (specific instance/request pair), but "signals" is undefined and does not match the tool name's promise of an "instance summary." It does not distinguish this tool from siblings like get_timeline or get_case_memory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given. It never says when to prefer this over get_timeline or get_case_memory, nor what preconditions (e.g., a known request_id) must hold.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_timelineC
Return bounded opening and terminal events of the specified operation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| request_id | Yes | ||
| instance_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that results are bounded and limited to opening and terminal events rather than a full event list, but it omits read-only confirmation, pagination behavior, and how the limit parameter affects the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. However, its brevity contributes to ambiguity around what 'bounded' and 'specified operation' mean in practice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema may cover return values, but the input schema has 0% description coverage and there are no annotations. For a three-parameter tool, the description leaves key invocation details and behavioral expectations undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for three parameters, and the description does not explain instance_id, request_id, or limit. The phrase 'specified operation' hints at request_id but does not provide enough semantic detail to compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Return') and resource scope ('opening and terminal events of the specified operation'). It is clear enough to distinguish from generic log/search tools, though it does not explicitly name or differentiate itself from any sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as search_logs or get_instance_summary. It implies the tool is for inspecting an operation's events, but offers no conditions, exclusions, or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_ticket_draftA
Persist a draft in PostgreSQL only when the caller explicitly passes approved=true.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket | Yes | ||
| approved | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the approval gate and the persistence backend, but omits what happens when approved=false (no-op vs. error), permission requirements, and whether saving a draft is idempotent or overwrites an existing draft.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the gating condition is stated as part of the core purpose rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, a required nested-object parameter, and 0% schema coverage, the description is too thin — an agent knows the gate but not the ticket payload shape or failure behavior. The existing output schema removes the need to explain return values, but that alone doesn't close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and one parameter, ticket, is an unconstrained object (additionalProperties: true) with no description anywhere — the description does not hint at what fields a valid ticket must contain. It only clarifies approved's effect, meaning the more complex required parameter remains entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (persist), resource (a draft), and storage target (PostgreSQL), which no sibling tool overlaps with — all siblings are read/inspection tools. An agent can immediately tell this is the sole write path for drafts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit gating condition: persist only when the caller passes approved=true, which effectively tells the agent when this tool will act. It stops short of naming alternatives or describing what to do instead when approved is false (skip the call? use another tool?).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_logsC
Read at most 100 matching logs. This tool never exposes evaluation labels.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| levels | No | ||
| request_id | Yes | ||
| instance_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but it does add two real behavioral facts: reads are bounded to 100 results, and evaluation labels are never exposed (a useful data-disclosure guarantee). It omits ordering, pagination/truncation behavior, error behavior, and permission requirements, so it is only partially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler; the scope constraint and the data-exposure guarantee are each stated once. Nothing could be trimmed without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained, but for a 5-parameter search tool with zero schema descriptions and no annotations, the description leaves filtering semantics, required-identifier usage, and sibling routing entirely unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters. The description only obliquely touches the limit parameter by implying a ceiling of 100 (schema default 30), and says nothing about query, levels, request_id, or instance_id semantics. This does not compensate for the undocumented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb and resource ("Read ... matching logs") and a hard cap of 100, so the basic action is clear. However, it never says what the logs are matched against, nor does it distinguish this from siblings like get_timeline or search_runbooks that an agent could plausibly reach for instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: no indication of when search_logs is preferred over get_timeline, get_instance_summary, or search_runbooks, and no mention of prerequisites such as requiring an instance_id and request_id. The agent must infer routing purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_runbooksC
Find citeable Runbook chunks; guidance is not incident evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses a key semantic trait—that results are guidance, not evidence—which is valuable. However, it doesn't mention return format (despite an output schema existing), pagination, or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—just two clauses—and front-loaded with the core action. It could be slightly more informative without becoming verbose, but it avoids waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero schema description coverage, no annotations, and the presence of an output schema, the description is incomplete. It does not explain parameters, return structure, or differentiate from siblings, leaving the agent with insufficient information to call the tool correctly in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. It mentions no parameter details; 'query' and 'limit' are not explained in the description. The phrase 'citeable chunks' implies a chunked return but does not clarify query behavior or limit semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a retrieval intent ('Find citeable Runbook chunks') but the phrasing is terse and domain-specific. 'Citeable' and 'Runbook chunks' are jargon that an agent may not disambiguate without prior context. It doesn't clearly distinguish itself from sibling search_logs beyond the resource name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage hint is the caveat 'guidance is not incident evidence,' which implies a negative use-case (don't use as evidence) but offers no positive guidance on when to prefer this tool over search_logs or get_case_memory. There are no explicit alternatives or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_evidenceC
Verify citations match both the investigated instance and request.
| Name | Required | Description | Default |
|---|---|---|---|
| citations | Yes | ||
| request_id | Yes | ||
| instance_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and provides almost none of it: no side effects, no permission requirements, no statement of what happens on mismatch, no indication whether this is a read-only check or a mutating operation. Only the matching condition is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the action and its scope come first. It is efficient, though arguably too terse to be fully self-sufficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, which lowers the bar. Still, for a validation tool with zero annotation and zero schema-description coverage, the definition leaves the semantics of a 'match' and the failure behavior unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with three required parameters, so the description must compensate. It does map loosely onto all three params (citations, instance, request), but adds no format or syntax detail — e.g., what a citation string looks like or how instance_id/request_id relate to it. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Verify') and resource ('citations') plus the scope conditions (match the investigated instance and request). No sibling in the list performs validation, so differentiation is implicit rather than stated. Clear, but not maximally sharp about what a 'match' entails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative-tool guidance. Usage can only be inferred from the purpose sentence (i.e., call it when you have citations to check). No routing information relative to siblings like get_instance_summary or get_timeline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
get_case_memory - First observed
get_instance_summary - First observed
get_timeline - First observed
save_ticket_draft - First observed
search_logs - First observed
search_runbooks - First observed
validate_evidence
TDQS
Scored across 7 tools
Most tools target distinct resources/actions (validate_evidence, save_ticket_draft, search_logs, search_runbooks, get_timeline), but the read-side tools get_instance_summary, get_timeline, search_logs, and get_case_memory all return signals/context for the same instance/request pair and could be confused without careful reading. The descriptions disambiguate well enough (e.g. timeline = opening/terminal events, case memory = approved drafts).
All names follow a consistent snake_case verb_noun pattern (get_*, search_*, validate_*, save_*), so the operation type is predictable at a glance. No mixed conventions or vague verbs.
Seven tools is well-scoped for an incident investigation workflow, covering read/evidence/draft concerns without redundancy. Each tool earns its place.
The surface covers the core investigation lifecycle: gather signals, timeline, logs, runbooks, validate evidence, persist a draft, and recall prior drafts. Minor gaps exist (no tool to fetch/close the ticket itself or delete/update drafts), but agents can work around them.
Maintenance
Related MCP Connectors
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Read-only finance and operations controls for AI agents with evidence and safe next actions.
Human-in-the-loop review and approval for AI agents. Audit trail, approval policies, native MCP.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables read-only Kubernetes incident investigation through MCP tools for listing pods, describing resources, fetching logs, and searching runbooks.1-
- FlicenseNot gradedqualityCmaintenanceEnables approval-gated incident response workflows that gather evidence through read-only MCP tools, perform idempotent writes, and preserve a durable audit trail.-
- AlicenseNot gradedqualityCmaintenanceEnables AI clients to perform safe, read-only IT diagnostics and retrieve local runbooks, asset records, and knowledge articles through MCP, with allowlisted network checks and audit logging.MIT
- AlicenseNot gradedqualityCmaintenanceProvides MCP-compatible safe read tools for incident investigation, enabling evidence collection and operational data access while keeping risky actions under human approval.MIT