fortigate-mcp
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., "@fortigate-mcpshow me the FortiGate system status"
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.
FortiGate MCP Server (Safe Write Capable)
Write tools are dry-run by default and require explicit environment and per-call confirmation. See SAFE_WRITE_MODE.md.
MCP Server สำหรับให้ Claude Desktop เชื่อมต่อกับ FortiGate ผ่าน REST API ใช้ได้เฉพาะอ่าน config (read-only) ปลอดภัย ไม่สามารถแก้ไขได้
✨ Features
🔐 Read-only — แม้ token หลุดก็แก้ config ไม่ได้
🐳 Docker — isolated environment
📡 stdio transport — ไม่ต้องเปิด port
🛡️ Trusted host enforcement บน FortiGate
Related MCP server: FortiManager MCP Server
🛠️ Tools ที่ใช้ได้
Tool | หน้าที่ |
| ดู firmware version, hostname, etc. |
| ดูรายชื่อ address group ทั้งหมด |
| ดู member ใน group |
| ดูรายชื่อ address object |
| ดู IP จริงของ address object |
| ดู policy ทั้งหมด |
| ดู policy ตัวเดียวละเอียด |
| ดู web filter profile |
| ดู URL allow/block ใน profile |
| ดู custom service |
| Safely create firewall policy, dry-run by default |
| Safely update firewall policy after reading current state |
📦 Setup
1. Clone/copy โปรเจกต์ลงเครื่อง
วาง folder fortigate-mcp ไว้ที่ไหนก็ได้ เช่น:
Windows:
C:\mcp\fortigate-mcpMac/Linux:
~/mcp/fortigate-mcp
2. ตั้งค่า .env
cp .env.example .envแก้ .env:
FORTIGATE_HOST=172.16.1.X # IP ของ FortiGate
FORTIGATE_TOKEN=xxxxxxxxxxxx # token จาก REST API admin
FORTIGATE_VERIFY_SSL=false # true ถ้ามี valid cert
FORTIGATE_TIMEOUT=100003. Build Docker image
cd fortigate-mcp
docker compose build4. ทดสอบ container ทำงาน
# ทดสอบ run แบบ interactive (Ctrl+C เพื่อออก)
docker compose run --rm fortigate-mcpถ้าเห็น log:
[FortiGate MCP] Server running on stdio
[FortiGate MCP] Connected to: 172.16.1.X
[FortiGate MCP] Mode: READ-ONLYแสดงว่า container ทำงานได้ ✅
หมายเหตุ: server จะรอ MCP protocol input จาก stdin — ถ้าไม่มี input ก็ปกติ Ctrl+C ปิดได้เลย
5. Register กับ Claude Desktop
แก้ไฟล์ config ของ Claude Desktop:
Windows: %APPDATA%\Claude\claude_desktop_config.json
Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
เพิ่ม mcpServers:
{
"mcpServers": {
"fortigate": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"--env-file",
"C:\\path\\to\\fortigate-mcp\\.env",
"fortigate-mcp:latest"
]
}
}
}⚠️ Windows: ใช้
\\แทน\ในเส้นทางไฟล์ Mac/Linux: ใช้/path/to/fortigate-mcp/.env
6. Restart Claude Desktop
ปิดเปิด Claude Desktop ใหม่ทั้งหมด (ไม่ใช่แค่ปิดหน้าต่าง — quit จาก system tray)
7. ทดสอบ
ถาม Claude ว่า:
"ลอง fortigate_get_system_status FortiGate ของฉันหน่อย"
ถ้าได้ข้อมูล hostname ETTFAC กลับมา = สำเร็จ! 🎉
🔍 ตัวอย่างคำถาม
"ip068 อยู่ใน address group ไหนบ้าง?"
"Web filter profile 'Only Use AI' allow domain อะไรบ้าง?"
"Custom service 'Everest_default' ใช้ port อะไร?"
"policy ไหนที่ใช้ source 'Wifi'?"
🛡️ Security Notes
✅ Token เก็บใน
.envไม่ถูก commit (มี.gitignore)✅ Container รันด้วย non-root user
✅ Trusted host enforcement บน FortiGate
✅ Read-only profile บน FortiGate (defense in depth)
⚠️ อย่า commit
.envลง git⚠️ อย่า share token กับใคร (รวมถึงในแชต Claude)
🐛 Troubleshooting
Error: connect ECONNREFUSED
เช็คว่า FortiGate IP ถูกต้องใน
.envเช็คว่าเครื่องที่รัน Docker เข้าถึง FortiGate ได้ (ลอง
ping)
FortiGate API error (401)
Token ผิด หรือ expire — regenerate ใหม่ที่ FortiGate
FortiGate API error (403)
Trusted host ไม่ตรง — เช็ค IP ของเครื่องที่รัน Docker
Container อาจใช้ IP ต่างจาก host (ลอง
network_mode: hostใน docker-compose)
Claude Desktop ไม่เห็น tool
เช็คว่า restart Claude Desktop แล้วจริงหรือยัง (quit จาก tray)
เช็ค path ใน
claude_desktop_config.jsonถูกต้องดู log ที่
%APPDATA%\Claude\logs\(Windows)
Available Tools
18 toolsfortigate_create_addressCreate address object (safe)A
Safely create a firewall address object. Defaults to dry_run=true. To apply, set FORTIGATE_ENABLE_WRITE=true and pass confirm exactly as the configured confirmation phrase.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New address object name | |
| type | No | Address type. Defaults to ipmask. | |
| subnet | No | Subnet for ipmask type, e.g. '192.0.2.10 255.255.255.255' | |
| fqdn | No | FQDN for fqdn type, e.g. 'example.com' | |
| comment | No | Optional FortiGate comment | |
| dry_run | No | Defaults to true (plan only). Set false to apply a real change. | |
| confirm | No | Required only when dry_run=false; must equal exactly 'APPLY FORTIGATE CHANGE'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the default dry_run=true and the apply workflow, which is critical for safety. Annotations indicate non-idempotent, non-destructive, write operation; description aligns. Missing info on idempotency, but overall good transparency.
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 concise sentences: one for purpose, one for usage. No redundant words, front-loaded with key information.
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?
Adequate for a create tool with complete schema. The safety workflow is explained. No output schema mentioned, but not needed. Minor gap: no mention of error behavior or whether duplicate names cause idempotent updates or errors.
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 covers all 7 parameters with detailed descriptions (100% coverage). Description only reiterates the dry_run default and confirm requirement, adding no new semantic value beyond 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?
Clearly states the verb 'create' and resource 'firewall address object'. The 'safely' qualifier and mention of dry_run=true distinguish it from sibling tools that might be more direct or destructive.
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?
Provides guidance on using dry_run and confirmation for safety, but does not explicitly advise when to choose this tool over alternatives like fortigate_create_address_group or fortigate_update_address. No when-not-to-use or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_create_address_groupCreate address group (safe)A
Safely create a firewall address group with explicit members. Defaults to dry_run=true.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New address group name | |
| members | Yes | Existing address object names to include | |
| comment | No | Optional FortiGate comment | |
| dry_run | No | Defaults to true (plan only). Set false to apply a real change. | |
| confirm | No | Required only when dry_run=false; must equal exactly 'APPLY FORTIGATE CHANGE'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond annotations by disclosing the dry_run=true default and safety aspect, which helps the agent understand the tool's non-destructive nature despite readOnlyHint=false.
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?
Single sentence covering purpose and default behavior. Efficient but could benefit from structure like bullet points for clarity.
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?
Covers core purpose and safety but lacks details on return values, error handling, or how to use the confirm field. With no output schema, the agent may miss expected outcomes.
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 100%, so baseline is 3. The description mentions 'Defaults to dry_run=true' which is already in the schema, adding minimal extra value. No further semantic enrichment.
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?
Clearly states the verb 'create', resource 'firewall address group', and key behavior 'explicit members' and 'safe' with dry_run default. Distinguishes from sibling tools like create_address or create_policy.
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 explicit guidance on when to use this tool vs alternatives (e.g., update_address_group_members). The 'safely' and dry_run default imply caution but lack direct when-to-use or when-not-to-use statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_create_policyCreate firewall policy (safe)A
Safely create a firewall policy. Defaults to dry_run=true. To apply, set FORTIGATE_ENABLE_WRITE=true and pass confirm exactly as the configured confirmation phrase.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New firewall policy name | |
| srcintf | Yes | Incoming interface names, e.g. ['lan'] | |
| dstintf | Yes | Outgoing interface names, e.g. ['virtual-wan-link'] | |
| srcaddr | Yes | Source address or group names | |
| dstaddr | No | Destination address/group names (required unless internet-service=enable) | |
| service | No | Service names (required unless internet-service=enable) | |
| policyid | No | Optional policy ID; FortiGate auto-assigns when omitted. | |
| status | No | Defaults to enable on create. | |
| action | No | Defaults to accept on create. | |
| schedule | No | Defaults to always on create. | |
| comments | No | Optional FortiGate comment | |
| nat | No | Defaults to enable on create. | |
| utm-status | No | Enable or disable UTM profiles. | |
| logtraffic | No | Defaults to all on create. | |
| logtraffic-start | No | ||
| internet-service | No | Enable FortiGuard Internet Service destination matching. | |
| internet-service-name | No | Internet Service names when internet-service is enabled | |
| internet-service-group | No | Internet Service group names when internet-service is enabled | |
| ssl-ssh-profile | No | Optional SSL/SSH inspection profile | |
| av-profile | No | Optional antivirus profile | |
| webfilter-profile | No | Optional web filter profile | |
| dnsfilter-profile | No | Optional DNS filter profile | |
| ips-sensor | No | Optional IPS sensor | |
| application-list | No | Optional application control list | |
| profile-protocol-options | No | Optional protocol options profile | |
| dry_run | No | Defaults to true (plan only). Set false to apply a real change. | |
| confirm | No | Required only when dry_run=false; must equal exactly 'APPLY FORTIGATE CHANGE'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits: it defaults to dry_run=true (safe mode) and requires a confirmation phrase for actual changes. Annotations indicate readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, which align with the described safety mechanism. No contradictions found.
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 two sentences, front-loading the core action and safety detail. Every sentence earns its place. No redundant or verbose language.
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 the tool's complexity (27 parameters), the high schema coverage (96%) and the concise description adequately cover key aspects: creation action, safety defaults, and confirmation requirement. No output schema exists, but the return value is not critical for tool selection. The description is complete for an agent to use correctly.
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 96%, so the schema itself provides strong parameter documentation. The description adds value by explaining the workflow for dry_run and confirm parameters, which are critical for safe operation. However, it does not elaborate on other parameters beyond what the schema already describes.
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 clearly states the tool's purpose: 'Safely create a firewall policy.' The verb 'create' and resource 'firewall policy' are unambiguous. The title reinforces this with 'Create firewall policy (safe).' It distinguishes from sibling update/delete tools by focusing on creation only.
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 description explicitly states when to use dry run vs. apply: 'Defaults to dry_run=true. To apply, set FORTIGATE_ENABLE_WRITE=true and pass confirm exactly as the configured confirmation phrase.' It provides clear context for safe usage but does not explicitly mention alternatives or when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_delete_addressDelete address object (safe)ADestructiveIdempotent
Safely delete a firewall address object. Reads the current object first and defaults to dry_run=true.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Existing address object name | |
| dry_run | No | Defaults to true (plan only). Set false to apply a real change. | |
| confirm | No | Required only when dry_run=false; must equal exactly 'APPLY FORTIGATE CHANGE'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint: true, idempotentHint: true), the description discloses that the tool reads the current object before deletion and defaults to dry_run=true. This adds critical safety context that annotations do not cover. No contradictions with annotations.
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, concise sentence that immediately conveys the tool's purpose and key safety behavior. Front-loaded with the verb 'Safely delete' and the resource, with zero wasted words.
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 no output schema, the description does not explain return values (e.g., what the plan output looks like on dry_run or success/failure on real delete). It covers the safety pattern but omits output behavior and error conditions. For a delete tool with good annotations and schema, this is adequate but not complete.
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 100% with clear parameter descriptions. The description adds that dry_run defaults to true and that confirm is required when dry_run=false, but this is already stated in the schema. The description adds minimal new semantic value beyond the schema, so baseline 3 is appropriate.
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 clearly specifies the verb 'delete' and the resource 'firewall address object'. It distinguishes from sibling tools like fortigate_delete_address_group by focusing on address objects. The mention of 'safely' and the default dry_run behavior adds specificity.
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 description implies a safe deletion workflow: read first, dry_run by default. It gives clear context for when to use this tool—to delete an address object safely. However, it does not explicitly state when not to use it or compare to alternatives like update or list tools. Still, the guidance is effective for a delete tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_delete_address_groupDelete address group (safe)ADestructiveIdempotent
Safely delete a firewall address group. Reads the current object first and defaults to dry_run=true.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Existing address group name | |
| dry_run | No | Defaults to true (plan only). Set false to apply a real change. | |
| confirm | No | Required only when dry_run=false; must equal exactly 'APPLY FORTIGATE CHANGE'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds behavioral context: reads current object first and defaults to dry_run=true. Annotations declare destructive and idempotent, but description explains the safety mechanism.
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?
Single sentence, front-loaded with purpose and safety behavior. No wasted words.
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?
Covers core action and safety behavior. No output schema needed, but return values not described. Sufficient for a delete tool with annotations.
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 100% with clear descriptions. Description does not elaborate on parameters, but baseline 3 is appropriate when schema is complete.
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?
Title and description clearly state the verb 'delete' and resource 'address group', with the safety qualifier 'safe'. Distinguished from sibling read tools.
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?
Implied usage from name and safety description, but no explicit guidance on when to use vs alternatives like fortigate_get_address_group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_get_addressGet address object detailsARead-only
Get details of a specific firewall address object (the actual IP/subnet it represents).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Address object name (e.g. 'ip068') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true. The description adds minimal extra behavior context by stating what details are retrieved (IP/subnet). It does not contradict annotations.
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 wasted words. Every word provides value, making it highly concise.
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 simple read-only tool with comprehensive annotations and a well-documented single parameter, the description adequately completes the context. The output is hinted at but no output schema exists, so a slight deduction.
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?
The schema covers 100% of parameter descriptions, and the description does not add additional semantics beyond what the schema already provides. Baseline of 3 is appropriate.
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 clearly specifies the action 'Get' and the resource 'details of a specific firewall address object', and adds clarifying context 'the actual IP/subnet it represents'. This effectively distinguishes it from sibling tools like fortigate_get_address_group.
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?
Guidance is implied by the name and description: use this to get details of a single address object by name. However, there is no explicit statement of when not to use it or alternatives like fortigate_list_addresses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_get_address_groupGet address group detailsARead-only
Get full details of a specific address group, including all member IPs/addresses. Useful for finding which IPs are in groups like 'Wifi', 'IT Team', 'Only Use AI'.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Address group name (e.g. 'Only Use AI', 'Wifi') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows it's safe. The description adds that it returns 'full details' and member IPs, which is consistent. No additional behaviors (e.g., pagination, rate limits) are discussed, but the annotations cover the primary behavioral trait.
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 sentences, no redundancy. The first sentence states the core purpose, and the second provides a concrete usage example. Every word earns its place.
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 the tool's simplicity (single parameter, read-only, no output schema) and the presence of helpful annotations, the description fully covers what an agent needs: what it does, what it returns, and when to use it.
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?
The schema describes the 'name' parameter with an example, and the description reinforces with similar examples. Since schema coverage is 100%, the description adds minimal new semantic value beyond what the schema provides.
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?
Description clearly states the verb 'Get full details' and the specific resource 'address group', and distinguishes from sibling tools like list_address_groups (which lists names) and get_address (single IP). It also specifies what is included: 'all member IPs/addresses'.
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 description provides a clear usage context by suggesting it's useful for finding IPs in groups like 'Wifi', 'IT Team', etc. However, it does not explicitly state when not to use this tool or mention alternatives (e.g., using list_address_groups for a quick overview).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_get_policyGet firewall policy detailsARead-only
Get full details of a specific firewall policy by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| policyid | Yes | Policy ID number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds 'Get full details' which is consistent but does not disclose any additional behavioral traits beyond what annotations provide.
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, clear sentence with no extraneous words. It is appropriately front-loaded and concise.
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 simple get-by-ID tool with one parameter and no output schema, the description is complete. It tells the agent what the tool does and what input is needed.
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 100% with the parameter described as 'Policy ID number'. The description does not add any new meaning beyond what the schema already provides.
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 clearly states the verb 'Get', the resource 'firewall policy', and the scope 'by ID'. It distinguishes from sibling tools like 'fortigate_list_policies' which lists policies, and other 'get_' tools for different resources.
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 description implies use when you need full details of a specific policy by ID. It provides clear context but does not explicitly mention when not to use it or alternatives like list_policies for finding IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_get_system_statusGet FortiGate system statusARead-only
Get FortiGate system status (firmware version, hostname, serial, uptime). Use this first to verify connectivity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates no side effects. The description adds specific returned fields, which is useful but not extensive. No contradiction with annotations.
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 sentences with no wasted words. The tool's action and resource are stated first, followed by recommended usage. Ideal for quick parsing.
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 parameters and a simple read-only operation, the description covers the essential purpose and expected output. Could mention the return format, but not critical for a status check.
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?
There are zero parameters, so the schema provides complete coverage. The description does not need to add parameter information, and it does not mislead.
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 clearly states the tool retrieves FortiGate system status and lists specific fields (firmware version, hostname, serial, uptime). It is distinct from sibling tools that perform CRUD operations on other resources.
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 description explicitly recommends using this tool first to verify connectivity, providing clear usage context. It does not specify when not to use it, but the simple read-only nature makes exclusion obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_get_webfilter_profileGet web filter profile detailsARead-only
Get full details of a web filter profile, including URL filters (allow/block lists) and category filters. Useful for understanding what 'Only Use AI', 'Translator Google' profiles allow.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Web filter profile name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds detail about returned content (URL filters, category filters) beyond readOnlyHint annotation. Consistent with read-only nature.
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 concise sentences: first states purpose, second gives usage context. No wasted words.
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?
Simple tool with one parameter and no output schema. Description provides enough context for an agent to understand when and how to use it. Could mention return format but not necessary given simplicity.
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 has 100% coverage with a clear description for 'name'. Description adds no additional meaning, so baseline score of 3 is appropriate.
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?
Description clearly states verb 'Get' and resource 'web filter profile', and specifies details (URL filters, category filters). Distinguishes from sibling 'list' tool by focusing on 'full details'.
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?
Provides example usage ('Useful for understanding what profiles allow'), implying when to use. Does not explicitly exclude alternatives but context with sibling tools makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_list_addressesList address objectsARead-only
List all firewall address objects (single IPs/subnets, just names). Useful for finding objects like 'ip068', 'ip080'.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so description adds no new safety information. The description confirms it lists 'all' objects and gives example names, but does not disclose additional behaviors like pagination, performance, or return format. With annotations covering the read-only nature, a score of 3 is appropriate.
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 at two sentences, with the key action and example usage front-loaded. Every word serves a purpose; no filler or redundancy.
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 simple list-all tool with no input parameters and no output schema, the description is mostly complete. It states the scope ('all'), the resource type, and provides examples. The only minor gap is the ambiguity of 'just names'—does it return only names or full objects with names? But overall sufficient.
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?
There are zero parameters, so the schema already covers all inputs. The description adds no parameter information (none needed). According to the rubric, with 0 parameters, baseline is 4. No additional value is necessary.
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?
Description clearly states 'List all firewall address objects' with specific context of single IPs/subnets. Distinguishes from sibling tools like 'fortigate_get_address' and 'fortigate_list_address_groups' by focusing on listing all objects rather than a single or groups. The example object names reinforce the resource type.
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 description provides a use case ('useful for finding objects like ip068, ip080') but does not explicitly state when to use this over alternatives like fortigate_get_address for a specific object or fortigate_list_address_groups for groups. No exclusions or when-not-to-use guidance is given, so guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_list_address_groupsList address groupsARead-only
List all firewall address groups (just names). Use this to find which group contains a specific IP, or to see available groups before calling fortigate_get_address_group.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description's note about 'just names' adds transparency about output scope. No contradictions; behavioral burden is low for a simple list operation.
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 sentences, front-loaded with the core action, followed by usage guidance. No redundant information. Highly efficient.
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 simple read-only list tool with zero parameters, the description covers purpose, usage, and output hint ('just names'). No output schema needed; agent can use it correctly.
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?
No parameters in input schema, so description cannot add parameter meaning. Baseline score of 4 is appropriate since schema coverage is 100% with no parameters to document.
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?
Description clearly states the verb 'List' and resource 'firewall address groups', and specifies it returns 'just names'. This distinguishes it from sibling tools like fortigate_get_address_group which returns full details.
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?
Explicitly states two use cases: find which group contains an IP, and list before calling get_details. Lacks explicit 'when not to use' but provides strong context. Could mention alternatives like fortigate_get_address_group for specific info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_list_policiesList firewall policiesARead-only
List all firewall policies in order with key fields (id, name, src, dst, service, action). Top of list = highest priority. Use this to understand traffic flow rules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'List all firewall policies,' but the annotation openWorldHint=true indicates the result set may not be exhaustive. This is a direct contradiction, as 'all' implies completeness. Additionally, no pagination or limit details are provided. Annotations already declare readOnlyHint=true, but the contradiction undermines transparency.
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 concise sentences, front-loaded with purpose and key fields. No wasted words.
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 parameters, read-only annotations, and no output schema, the description covers the essential behavior and use case. It could mention that the output is read-only (already in annotations) or note ordering details more explicitly (e.g., priority order), but it is largely sufficient.
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?
No parameters exist and schema coverage is 100%, so the description does not need to add parameter details. The description adds no param info, but this is acceptable given the zero-param input 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 clearly states the tool lists all firewall policies in order and specifies key fields returned. It is distinct from sibling tools like fortigate_get_policy (single) and fortigate_list_addresses (different resource).
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 description says 'Use this to understand traffic flow rules,' providing a clear use case. It does not explicitly contrast with get_policy, but the context of listing vs single retrieval is implicit. No when-not-to-use guidance, but adequate for a simple list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_list_servicesList custom servicesARead-only
List all custom firewall services (just names). Useful for understanding services like 'Everest_default', 'anydesk_6568'.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds value beyond annotations by clarifying the output includes only names, not full details. Annotations already declare readOnlyHint and openWorldHint, so description is consistent and adds useful behavioral context.
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 sentences, zero waste. First sentence states the action, second provides an illustrative example. Every word earns its place.
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 no parameters and no output schema, the description adequately explains what the tool does and gives example names. Could be more explicit about the return format, but 'just names' hints at a simple list.
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?
No parameters exist, so schema coverage is 100%. Baseline score of 4 applies as description has no need to compensate for missing parameter info.
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?
Clearly states 'List all custom firewall services (just names)' with a specific verb (list) and resource (custom firewall services). Distinguishes from sibling tools which handle addresses, groups, policies, etc.
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?
Provides a use case example ('Understanding services like Everest_default, anydesk_6568') but lacks explicit when-to-use, when-not-to-use, or alternatives. Implies usage but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_list_webfilter_profilesList web filter profilesARead-only
List all web filter profiles (just names).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, indicating safe read and potential variability. The description adds that only names are returned, which is useful but still omits details like pagination, ordering, or empty list 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?
The description is a single sentence with no wasted words. It is appropriately sized for the tool's simplicity and front-loaded with the key information.
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 no output schema, the description compensates by stating what is returned ('just names'). The tool is simple (no params, no nested objects), so this level of detail is nearly complete. However, it could clarify the return format (e.g., array of strings) or that an empty list is possible.
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?
There are no parameters, and schema coverage is 100% (trivially). Following guidelines, baseline is 4 for 0 parameters. The description does not need to add parameter 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 'List all web filter profiles (just names)' clearly specifies the action (list), resource (web filter profiles), scope (all), and content (just names). It distinguishes from siblings like fortigate_get_webfilter_profile which retrieves full details.
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 description implies this tool is for quick listing of names only, but does not explicitly state when to use it versus alternatives like fortigate_get_webfilter_profile for details. No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_update_addressUpdate address object (safe)AIdempotent
Safely update a firewall address object. Reads the current object first and defaults to dry_run=true.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Existing address object name | |
| type | No | Optional address type | |
| subnet | No | Optional subnet for ipmask type | |
| fqdn | No | Optional FQDN for fqdn type | |
| comment | No | Optional FortiGate comment | |
| dry_run | No | Defaults to true (plan only). Set false to apply a real change. | |
| confirm | No | Required only when dry_run=false; must equal exactly 'APPLY FORTIGATE CHANGE'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: it reads the current object first, defaults to dry_run=true, and implies need for confirm to apply. No contradictions.
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 concise sentences front-loading the key safety behavior. No superfluous information.
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 annotations, schema coverage, and no output schema, the description covers essential behavioral details (safety, dry run, confirm). No obvious gaps.
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 100% with detailed descriptions for each parameter. The description only reiterates dry_run default, adding minimal extra meaning. Baseline 3 is appropriate.
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 tool name, title, and description clearly indicate it updates a FortiGate address object. The description specifies the safety mechanism, distinguishing it from sibling tools like create or delete.
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 description implies when to use (safe updates) but does not explicitly state when not to use or mention alternatives. The context of 'safe' and default dry_run provides reasonable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_update_address_group_membersUpdate address group members (safe)AIdempotent
Safely add, remove, or replace address group members. Reads current members first and defaults to dry_run=true.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Existing address group name | |
| action | Yes | How to change the member list | |
| members | Yes | Address object names to add, remove, or use as replacement | |
| dry_run | No | Defaults to true (plan only). Set false to apply a real change. | |
| confirm | No | Required only when dry_run=false; must equal exactly 'APPLY FORTIGATE CHANGE'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, destructiveHint=false, idempotentHint=true. The description adds useful behavioral details beyond these: the tool reads current members before acting and defaults to dry_run=true. This informs the agent of safe usage. No contradictions with annotations.
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 sentence that efficiently conveys the core action and two key safety behaviors. Every word is necessary; no fluff or repetition. Highly concise.
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 no output schema, the description omits return value details, which could be useful for an agent. However, the tool's behavior is straightforward (applies changes), and the safety features are well-described. This is a minor gap, so not a perfect 5.
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 100% with detailed parameter descriptions. The description reinforces the dry_run default but doesn't add new semantic meaning to parameters beyond what the schema provides. Baseline 3 is appropriate as the schema already does the heavy lifting.
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 clearly states the tool's function: 'Safely add, remove, or replace address group members'. It also mentions key safety aspects (reads current members first, defaults to dry_run=true). This distinguishes it from siblings like fortigate_update_address which modify different resources.
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 description implies usage by stating what the tool does and its safety defaults. It doesn't explicitly specify when to use or when not to use alternatives, but the sibling names (fortigate_create_address_group, fortigate_update_address) make the context clear. A more explicit 'Use this instead of X when...' would improve it, but current clarity is high.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fortigate_update_policyUpdate firewall policy (safe)AIdempotent
Safely update a firewall policy. Reads the current policy first and defaults to dry_run=true.
| Name | Required | Description | Default |
|---|---|---|---|
| policyid | Yes | Existing firewall policy ID | |
| name | No | Optional new firewall policy name | |
| srcintf | No | ||
| dstintf | No | ||
| srcaddr | No | ||
| dstaddr | No | ||
| service | No | ||
| status | No | Defaults to enable on create. | |
| action | No | Defaults to accept on create. | |
| schedule | No | Defaults to always on create. | |
| comments | No | Optional FortiGate comment | |
| nat | No | Defaults to enable on create. | |
| utm-status | No | Enable or disable UTM profiles. | |
| logtraffic | No | Defaults to all on create. | |
| logtraffic-start | No | ||
| internet-service | No | Enable FortiGuard Internet Service destination matching. | |
| internet-service-name | No | Internet Service names when internet-service is enabled | |
| internet-service-group | No | Internet Service group names when internet-service is enabled | |
| ssl-ssh-profile | No | Optional SSL/SSH inspection profile | |
| av-profile | No | Optional antivirus profile | |
| webfilter-profile | No | Optional web filter profile | |
| dnsfilter-profile | No | Optional DNS filter profile | |
| ips-sensor | No | Optional IPS sensor | |
| application-list | No | Optional application control list | |
| profile-protocol-options | No | Optional protocol options profile | |
| dry_run | No | Defaults to true (plan only). Set false to apply a real change. | |
| confirm | No | Required only when dry_run=false; must equal exactly 'APPLY FORTIGATE CHANGE'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-readonly, non-destructive, idempotent, and open-world. Description adds valuable behavioral context: reads current policy first and defaults to dry_run=true. No contradiction with annotations.
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 sentence efficiently conveys two key behaviors. Front-loaded with verb and safety qualifier. Could be slightly more structured but is already concise.
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?
Tool has 27 parameters and no output schema; description is very brief. Does not explain return format, behavior after dry_run, or how to apply changes. For a complex tool, this is incomplete.
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 78% (high), so baseline is 3. Description adds no additional parameter meaning beyond what the schema already provides. Does not explain any of the 27 parameters.
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?
Description clearly states 'update a firewall policy', distinguishing it from create tools. Verb 'update' and resource 'firewall policy' are specific. Sibling tools include create_policy, so purpose is unambiguous.
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?
Implies usage for safe updates via 'reads current policy first' and 'defaults to dry_run=true', but does not explicitly state when to use this vs. create_policy or other update tools. Lacks direct when-not guidance.
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.
18 tool updates
v0.1.0- First observed
fortigate_create_address - First observed
fortigate_create_address_group - First observed
fortigate_create_policy - First observed
fortigate_delete_address - First observed
fortigate_delete_address_group - First observed
fortigate_get_address - First observed
fortigate_get_address_group - First observed
fortigate_get_policy - First observed
fortigate_get_system_status - First observed
fortigate_get_webfilter_profile - First observed
fortigate_list_address_groups - First observed
fortigate_list_addresses - First observed
fortigate_list_policies - First observed
fortigate_list_services - First observed
fortigate_list_webfilter_profiles - First observed
fortigate_update_address - First observed
fortigate_update_address_group_members - First observed
fortigate_update_policy
TDQS
Scored across 18 tools
Each tool has a clear, distinct purpose targeting specific resources (address, address group, policy, service, web filter profile, system status). No overlapping functionality; get and list are appropriately separated.
All tools follow the consistent pattern 'fortigate_verb_noun' with lowercase and underscores. Verbs are uniform: create, delete, get, list, update. No mixing of conventions.
18 tools is slightly above the typical 3-15 range but still well-scoped for managing a FortiGate firewall. Each tool serves a necessary function without redundancy.
Covers CRUD for addresses and address groups, and list/get for policies, services, and web filter profiles. Notable gaps: missing delete for policies, and no create/update/delete for services and web filter profiles.
Maintenance
Related MCP Connectors
Give Claude only the Google Drive files you choose. Every action logged.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Manage hosts, redirects, SSL, and traffic analytics from Claude and other AI assistants.
Related MCP Servers
- AlicenseBqualityDmaintenanceA complete MCP server for Fortinet FortiOS 7.6.x that exposes the entire REST API as typed MCP tools for use with MCP-compatible clients like Claude Desktop.10011MIT
- AlicenseBqualityAmaintenanceEnables AI assistants to interact with FortiManager for centralized firewall policy management, device provisioning, and network configuration through the FortiManager JSON-RPC API.1006MIT
- FlicenseNot gradedqualityDmaintenanceConnects Claude to OpenNMS, allowing plain language interaction with alarms, nodes, events, asset records, categories, and service collection.1-
- FlicenseNot gradedqualityBmaintenanceConnects Claude Desktop to a ServiceNow instance, enabling natural-language interactions to read incidents, inspect CMDB and table schemas, and create records with guardrails like update set scoping and dry-run preview.-