{
  "ok": true,
  "resource": {
    "id": "RES_44263379B6DF",
    "resource_type": "mcp_server",
    "canonical_url": "https://registry.modelcontextprotocol.io/v0.1/servers/ai.analyticslegends%2Fsap-analytics/versions/1.0.6",
    "name": "Analytics Legends — SAP Analytics Intelligence",
    "summary_en": "AI agent for SAP analytics: firms, day rates, contract radar, news, concepts, studies",
    "summary_zh": "面向SAP分析的AI代理：公司、日费率、合同雷达、新闻、概念、研究",
    "description_en": "Analytics Legends — SAP Analytics Intelligence is an MCP server providing an AI agent for SAP analytics market intelligence. It offers tools to search a directory of SAP analytics service providers (firms), count firms by various facets, retrieve firm profiles, list freelance platforms, search a public contract radar for SAP opportunities, search market news, search a concept encyclopedia, retrieve concept metadata, list deep-research studies, access public day-rate aggregates, list SAP module taxonomy, search an Academy training catalogue, traverse a learning knowledge graph, and access paid content (concept cards, studies, Academy modules, SAP end-customer corpus, firm intelligence profiles) with appropriate subscription tiers. The server is published on the official MCP registry and is reachable via streamable HTTP at https://analyticslegends.ai/mcp. Runtime verification confirmed 20 tools, all read-only and idempotent, with detailed input/output schemas and citations.",
    "description_zh": "Analytics Legends — SAP Analytics Intelligence 是一个MCP服务器，提供面向SAP分析市场情报的AI代理。其工具包括：搜索SAP分析服务提供商目录（公司）、按不同维度对公司进行计数、获取公司简介、列出自由职业平台、搜索公开的SAP合同雷达机会、搜索市场新闻、搜索概念百科全书、获取概念元数据、列出深度研究、访问公开的日费率聚合数据、列出SAP模块分类、搜索学院培训目录、遍历学习知识图谱，以及访问付费内容（概念卡片、研究、学院模块、SAP最终客户语料库、公司情报简介），并具有相应的订阅层级。该服务器已在官方MCP注册表中发布，可通过流式HTTP在https://analyticslegends.ai/mcp访问。运行时验证确认了20个工具，均为只读且幂等，具有详细的输入/输出模式和引用。",
    "provider_name": "ai.analyticslegends",
    "homepage_url": "https://analyticslegends.ai/",
    "endpoint_url": "https://analyticslegends.ai/mcp",
    "source_url": "https://github.com/analyticslegends/analytics-legends-mcp",
    "icon_url": null,
    "cover_image_url": null,
    "capabilities": [
      "data.search",
      "data.retrieve",
      "data.analyze",
      "data.discover",
      "knowledge.retrieve"
    ],
    "categories": [
      "data",
      "research",
      "other"
    ],
    "industries": [
      "software",
      "general"
    ],
    "protocols": [
      "mcp"
    ],
    "auth": {
      "type": "unknown"
    },
    "pricing": {
      "model": "unknown"
    },
    "input_schema": {},
    "output_schema": {},
    "metadata": {
      "content_language": "en",
      "translation_status": "original-only",
      "official_registry": {
        "version": "1.0.6",
        "packages": [],
        "remotes": []
      },
      "review_gate": {
        "passed": true,
        "reasons": [],
        "policy_version": "review-gate-v1",
        "evaluated_at": "2026-09-03T06:32:03.541Z"
      }
    },
    "latest_version": "1.0.6",
    "status": "listed",
    "health_status": "healthy",
    "source_kind": "imported",
    "source_agent": "registry.modelcontextprotocol.io",
    "trust": {
      "signal": "none",
      "reason": "No suspicious or malicious evidence.",
      "signals": {
        "yellow": 0,
        "red": 0
      }
    },
    "review_summary": {
      "method_version": "capability-evidence-v2",
      "capability_definition": "strong",
      "contract_completeness": "strong",
      "access_friction": "low",
      "operational_transparency": "strong",
      "evidence_strength": "protocol_inspected",
      "use_readiness": "ready_for_guidance",
      "reviewed_at": "2026-09-03T06:32:04.697Z"
    },
    "experience_count": 0,
    "verified_experience_count": 0,
    "usage_count": 0,
    "success_rate": null,
    "first_seen_at": "2026-09-03T02:49:38.950Z",
    "last_seen_at": "2026-09-03T06:32:03.893Z",
    "published_at": "2026-09-03T06:32:03.893Z",
    "created_at": "2026-09-03T02:49:38.950Z",
    "updated_at": "2026-09-03T06:32:04.697Z",
    "api_url": "https://aiworkshub.io/api/v1/resources/RES_44263379B6DF",
    "reviews_url": "https://aiworkshub.io/api/v1/resources/RES_44263379B6DF/reviews",
    "public_url": "https://aiworkshub.io/resources/RES_44263379B6DF",
    "distribution": {
      "canonical_identity": "https://registry.modelcontextprotocol.io/v0.1/servers/ai.analyticslegends%2Fsap-analytics/versions/1.0.6",
      "syndicatable": true,
      "origins": [
        {
          "registry_url": "https://registry.modelcontextprotocol.io/",
          "upstream_resource_id": "ai.analyticslegends/sap-analytics@1.0.6",
          "upstream_record_url": "https://registry.modelcontextprotocol.io/v0.1/servers/ai.analyticslegends%2Fsap-analytics/versions/1.0.6",
          "relation": "syndicated",
          "metadata": {
            "source": "official-mcp-registry"
          },
          "first_seen_at": "2026-09-03T02:49:38.950Z",
          "last_seen_at": "2026-09-03T06:32:03.893Z"
        }
      ]
    },
    "tools": [
      {
        "name": "count_firms_by",
        "title_en": "Count the firm directory by country, kind, module or SAP signal",
        "title_zh": "按国家、类型、模块或SAP信号对公司目录进行计数",
        "description_en": "Answer counting questions about the firm directory in one call: how many organisations per country, kind, declared SAP module, or SAP signal band, with the same filters as search_firms.",
        "description_zh": "一次调用回答关于公司目录的计数问题：按国家、类型、声明的SAP模块或SAP信号频段统计组织数量，支持与search_firms相同的过滤器。",
        "input_schema": {
          "type": "object",
          "properties": {
            "by": {
              "type": "string",
              "enum": [
                "country",
                "kind",
                "module",
                "sap_signal_band"
              ],
              "description": "Which facet to count on. Required — there is no default worth guessing."
            },
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "country": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "description": "ISO-3166-1 alpha-2 country code, e.g. DE, FR, CH."
            },
            "kind": {
              "type": "string",
              "description": "Restrict to one organisation kind before counting, same vocabulary as search_firms. Combining it with `by:\"kind\"` is legal and returns that single bucket."
            },
            "module": {
              "type": "string",
              "description": "Restrict to organisations with a DECLARED link to one SAP module code before counting, same vocabulary as search_firms' `module`. Combining it with `by:\"module\"` is legal and returns that single bucket (plus the null bucket)."
            }
          },
          "required": [
            "by"
          ],
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "value": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "n": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "find_academy_modules",
        "title_en": "Search the Academy training catalogue",
        "title_zh": "搜索学院培训目录",
        "description_en": "Search the Analytics Legends Academy training modules by track, level and free text. Returns catalogue entry with metadata.",
        "description_zh": "按轨道、级别和自由文本搜索Analytics Legends学院培训模块。返回带有元数据的目录条目。",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "track": {
              "type": "string",
              "description": "Restrict to one track, by SLUG (`databricks-data-eng`) or by English name (`Databricks & Data Eng.`), matched case-insensitively. The live vocabulary with per-track counts is `_meta.available_tracks` on every response. The numeric track_id is deliberately NOT accepted — it is an internal counter, and passing `6` would look like naming a subject."
            },
            "level": {
              "type": "string",
              "description": "Restrict to one level, matched case-insensitively: Beginner · Intermediate · Advanced · Expert. Counts in `_meta.available_levels`."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Module id, e.g. M001 — the value get_academy_module takes."
                  },
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title_en": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "track_slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "level": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "duration_minutes": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "summary_en": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "status": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Editorial access marker: 'available' or 'legend-pass'. Served, not filtered on. READ 'legend-pass' AS 'sold at the CONSULTANT tier': it is a LEGACY label from when the paid tier was called Legend, it sits on the majority of rows, and the tier that actually opens the body here is Consultant (get_academy_module). The site stopped rendering this field for exactly that reason on 2026-07-26; this endpoint still serves the raw value, so the LABEL is the stale half and the tier floor is the true one."
                  },
                  "is_preview": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "The second free-access marker. Does NOT coincide with status — read both."
                  },
                  "title_fr": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "summary_fr": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "track_name_en": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "track_name_fr": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "tags": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "type": "string"
                    }
                  },
                  "updated_at": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "find_opportunities",
        "title_en": "Search the public SAP analytics contract radar",
        "title_zh": "搜索公开的SAP分析合同雷达",
        "description_en": "Search every SAP contract and permanent-role posting Analytics Legends publishes to anonymous visitors, merging two public legs: promoted feed and site radar.",
        "description_zh": "搜索Analytics Legends向匿名访客发布的每个SAP合同和永久职位，合并两个公共来源：推广信息流和网站雷达。",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "location": {
              "type": "string",
              "description": "City or place, matched case-insensitively as a substring of the posting's location. The promoted leg is all-German (Hamburg, Frankfurt am Main, Bremen, Munich, Cologne, Dortmund, Hanover, Landshut, Mannheim, Stuttgart); the site-radar leg is worldwide."
            },
            "country": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "description": "ISO-3166-1 alpha-2 code, applied to both legs as a predicate on the row's own country_code. It NO LONGER selects the site-radar leg alone: the promoted feed carried country_code on almost none of its rows until 2026-08-28 and now carries it on most, so a country filter now returns both legs. A row still without one is dropped because it does not match, not because its leg was excluded by assumption. `_meta.match_count_by_leg` shows what each leg contributed on YOUR call — read the split there, never from a figure quoted in this text."
            },
            "employment_type": {
              "type": "string",
              "enum": [
                "freelance",
                "contract",
                "permanent"
              ],
              "description": "Restrict to one engagement type. THE RADAR IS MOSTLY PERMANENT, so a freelance or contract question answered off an unfiltered page is answered with salaried jobs. For the actual split, make the filtered call and read `_meta.tranche_total_row_count` — it is counted at query time. The promoted leg declared NO contract_type until 2026-08-28 and now declares one on most of its rows, so a value here no longer drops that leg wholesale — only the rows still silent. THOSE ROWS ARE NOT A FOURTH TYPE AND NOT PERMANENT ONES: `_meta.available_employment_types` counts only what declares, and `_meta.employment_type_undeclared` carries the rest, so the two together are the population and either alone is not. Read both before quoting a mix."
            },
            "remote_mode": {
              "type": "string",
              "description": "Restrict to one work-location policy: `remote`, `hybrid` or `onsite`. READ THIS BEFORE ANSWERING A REMOTE QUESTION: a large share of the radar declares no policy at all (`_meta.remote_mode_undeclared` carries the live count — roughly half the radar when last measured, and a frozen pair written here drifted ~30% in two days), and an undeclared row is NOT an on-site row — it is a posting that does not say. Any value here therefore sets those rows aside rather than classifying them, exactly as the site's own filter does, and `_meta.remote_mode_undeclared` reports how many were set aside. The promoted leg carries its own `remote_mode` column and is filtered by the same predicate. Read `_meta.available_remote_modes` for the live spread before assuming a value exists."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title_lang": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO-639-1 language the TITLE is written in, as measured by the harvest chain — 'en' on 1,566 rows, 'de' on 337 (2026-08-23). Null when the chain could not decide. A harvested title is a third party's own words and is never translated, so this label is the only honest way to tell a reader the posting you are quoting is not in their language. Absent from the served payload until 2026-08-23: the projector's keep-list dropped it."
                  },
                  "firm_name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "location": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "country_code": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "ISO-3166-1 alpha-2 of the posting's own country. Null on almost all of the promoted leg."
                  },
                  "seniority": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "remote_mode": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The posting's declared work-location policy (`remote` / `hybrid` / `onsite`). NULL means the posting does not say — never read it as on-site."
                  },
                  "posted_at": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "source_url": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "employment_type": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "expires_at": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "rate_band": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Editorial benchmark for this posting's (seniority × product × region) cell — NOT a rate the employer offered. `basis` and `kind` are inside the object on purpose, so no extraction can lift the numbers away from what they mean. 2026-08-29: this band is a SUBSCRIBER surface and is no longer carried by the public radar file this lane reads — expect it to be null here. The posting's OWN published rate, when it has one, stays in currency / daily_rate_min / daily_rate_max."
                  },
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The posting's identity — stable across calls, key for dedup."
                  },
                  "leg": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "`promoted` or `site_radar` — which of the two merged public legs served this row."
                  },
                  "application_link": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "`public` (source_url is served) or `members_only` (the link to the original listing is the paid Consultant-tier deliverable; the row and its facts stay public)."
                  },
                  "skills": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Skills the posting names. Null when it names none."
                  },
                  "category": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "description": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Posting text, HTML stripped, clamped. Null on the radar leg."
                  },
                  "currency": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "daily_rate_min": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Only when the source declares a DAILY rate period — never converted from other periods."
                  },
                  "daily_rate_max": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "rate_period": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "duration_months": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "salary_min": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "salary_max": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "source": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "find_sap_clients",
        "title_en": "Search the SAP end-customer corpus (Legend tier)",
        "title_zh": "搜索SAP最终客户语料库（传奇级）",
        "description_en": "Search the SAP end-customer corpus, the companies that run SAP. Requires Legend tier key.",
        "description_zh": "搜索SAP最终客户语料库，即运行SAP的公司。需要传奇级密钥。",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "country": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "description": "ISO-3166-1 alpha-2 country code, e.g. DE, FR, CH."
            },
            "industry": {
              "type": "string",
              "maxLength": 200,
              "description": "Industry or sector filter, matched case-insensitively."
            },
            "product": {
              "type": "string",
              "enum": [
                "datasphere",
                "bdc",
                "sac",
                "bw",
                "bw4hana",
                "s4hana",
                "ecc",
                "hana",
                "joule",
                "businessobjects",
                "bpc",
                "successfactors",
                "ariba",
                "concur"
              ],
              "description": "Keep only end-customers where this SAP product was DETECTED in use. Absence from the result means undetected, not unused."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "country_code": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "industry": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sap_client_verification_status": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "get_academy_module",
        "title_en": "Read an Academy module (Consultant tier)",
        "title_zh": "阅读学院模块（顾问级）",
        "description_en": "Read one Academy training module in full, including body, learning objectives and summary. Requires subscriber key.",
        "description_zh": "完整阅读一个学院培训模块，包括正文、学习目标和摘要。需要订阅密钥。",
        "input_schema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "Module id (`M001`) or slug (`datasphere-foundations`), verbatim from find_academy_modules.rows[].id / .slug."
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title_en": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "body_en": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "objectives_en": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "items": {
                      "type": "string"
                    },
                    "description": "Learning objectives, one per element — a text[] column, not a paragraph."
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "get_concept",
        "title_en": "Concept metadata and editor's summary (public)",
        "title_zh": "概念元数据和编辑摘要（公开）",
        "description_en": "Fetch one concept entry by slug: title, category, level, tags and editor's summary. Subscriber content not returned.",
        "description_zh": "通过slug获取一个概念条目：标题、类别、级别、标签和编辑摘要。不返回订阅者内容。",
        "input_schema": {
          "type": "object",
          "properties": {
            "slug": {
              "type": "string",
              "description": "Concept slug from search_concepts."
            }
          },
          "required": [
            "slug"
          ],
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "summary": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "get_concept_card",
        "title_en": "Full concept card (Consultant tier)",
        "title_zh": "完整概念卡片（顾问级）",
        "description_en": "Full encyclopaedia card for one concept, including body, why-it-matters, key points, cheat sheet, glossary, pro tip and analysis tables. Requires subscriber key.",
        "description_zh": "一个概念的完整百科全书卡片，包括正文、重要性、要点、速查表、词汇表、专业提示和分析表格。需要订阅密钥。",
        "input_schema": {
          "type": "object",
          "properties": {
            "slug": {
              "type": "string",
              "description": "Concept slug, verbatim from search_concepts.rows[].slug."
            }
          },
          "required": [
            "slug"
          ],
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title_en": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "body_en": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "get_day_rate_benchmark",
        "title_en": "Public SAP analytics day-rate aggregate",
        "title_zh": "公开的SAP分析日费率聚合",
        "description_en": "Public day-rate aggregate for SAP analytics freelance work: min/max daily rate by country, specialisation and seniority, with source and confidence.",
        "description_zh": "SAP分析自由职业的公开日费率聚合：按国家、专业和资历提供最低/最高日费率，并附来源和置信度。",
        "input_schema": {
          "type": "object",
          "properties": {
            "country": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "description": "ISO-3166-1 alpha-2 country code, e.g. DE, FR, CH."
            },
            "specialisation": {
              "type": "string",
              "description": "One of the codes the aggregate actually holds — analytics_all, bw, bw4hana, bw4hana_sac, sac, datasphere (2026-08-09; the live list comes back as `_meta.available_specialisations` on every call). They are NOT evenly spread across countries: DE holds analytics_all only, at three seniorities, and datasphere exists for FR alone, as a median with confidence 'low'. There is no bdc row and no joule row in THIS aggregate — but the platform does price BDC: `find_opportunities` carries a panel-inferred band on the live postings, €1,000–€1,400/day P25–P75 for Senior BDC on 52 German postings (2026-08-10). A code this aggregate does not hold returns 0 rows and the available codes; it never widens to a neighbouring band, and 0 here does not mean the platform is silent."
            },
            "seniority": {
              "type": "string",
              "description": "e.g. senior, principal."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "country": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "specialisation": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "seniority": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sample_size": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "currency": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": true,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "get_firm",
        "title_en": "Get one firm's published profile",
        "title_zh": "获取单个公司的已发布简介",
        "description_en": "Fetch one organisation from the published directory by its database slug. Returns public fields plus partnerships_declared count.",
        "description_zh": "通过数据库slug从已发布目录中获取一个组织。返回公共字段以及声明的合作伙伴数量。",
        "input_schema": {
          "type": "object",
          "properties": {
            "slug": {
              "type": "string",
              "description": "The DATABASE slug, taken verbatim from search_firms.rows[].slug. It is not always the web slug in citation_url: a minority of published rows carry a numeric firm id instead (365 of them on 2026-08-09 — the population is read at query time and returned as `_meta.tranche_total_row_count`, never written down here). get_firm{slug:\"00393\"} is GULP, whose page is /companies/gulp/. Deriving a slug from the citation URL fails on those rows, and deriving it from the NAME is not safe either; carry rows[].slug across instead. A slug this tool refuses is not proof the firm is absent from the market or even from the database — the published tranche is an editorial subset, and a row the editor has not published is refused here exactly as a wrong slug is."
            }
          },
          "required": [
            "slug"
          ],
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "get_firm_intel",
        "title_en": "Firm intelligence profile (Legend tier)",
        "title_zh": "公司情报简介（传奇级）",
        "description_en": "Paid intelligence profile of a services firm, including SAP practice size, partner level, delivery flags, typical day rate and notable clients. Requires Legend tier key.",
        "description_zh": "服务公司的付费情报简介，包括SAP实践规模、合作伙伴级别、交付标志、典型日费率和知名客户。需要传奇级密钥。",
        "input_schema": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "maxLength": 200,
              "description": "Firm name, matched case-insensitively. Omit to browse the corpus by data completeness."
            },
            "country": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "description": "ISO-3166-1 alpha-2 country code, e.g. DE, FR, CH."
            },
            "delivers": {
              "type": "string",
              "enum": [
                "datasphere",
                "bdc",
                "sac",
                "bw",
                "bw4hana",
                "s4hana",
                "ecc",
                "hana",
                "joule",
                "businessobjects",
                "bpc",
                "successfactors",
                "ariba",
                "concur"
              ],
              "description": "Keep only firms whose profile DECLARES delivery of this product (the `delivers_*` flags every row already carries). An undeclared flag drops the row: absence from the result means the profile does not declare it, not that the firm cannot deliver it."
            },
            "mode": {
              "type": "string",
              "enum": [
                "freelance",
                "permanent",
                "subcontract"
              ],
              "description": "Keep only firms whose profile declares this engagement mode (mode_freelance / mode_permanent / mode_subcontract). Same reading as `delivers`: declared-only."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10,
              "default": 3,
              "description": "Max rows (hard cap 10 — these rows are wide)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "firm_id_unique": {},
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sap_partner_level": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "typical_day_rate_eur": {},
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "get_sap_client_profile",
        "title_en": "One SAP end-customer profile (Legend tier)",
        "title_zh": "单个SAP最终客户简介（传奇级）",
        "description_en": "Full profile of one SAP end-customer, including SAP footprint and analytics solutions. Requires Legend tier key.",
        "description_zh": "单个SAP最终客户的完整简介，包括SAP足迹和分析解决方案。需要传奇级密钥。",
        "input_schema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "maxLength": 160,
              "description": "Profile id, verbatim from find_sap_clients.rows[].id."
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sap_products_used": {},
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "get_study",
        "title_en": "Read a study (Consultant tier)",
        "title_zh": "阅读研究（顾问级）",
        "description_en": "Read one study body, served in sections to avoid response ceiling. Requires subscriber key.",
        "description_zh": "阅读一个研究正文，分段提供以避免响应上限。需要订阅密钥。",
        "input_schema": {
          "type": "object",
          "properties": {
            "slug": {
              "type": "string",
              "description": "Study slug, verbatim from list_studies.rows[].slug."
            },
            "lang": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "default": "en",
              "description": "ISO-639-1 language of the edition, e.g. en or fr. Defaults to en."
            },
            "section": {
              "type": "string",
              "maxLength": 200,
              "description": "A section heading from a previous call's `sections` list. Omit to get the list."
            }
          },
          "required": [
            "slug"
          ],
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "section_heading": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "list_firm_kinds",
        "title_en": "List firm kinds with live counts",
        "title_zh": "列出公司类型及实时计数",
        "description_en": "Breakdown of the published firm directory by organisation kind, with a live row count per kind.",
        "description_zh": "按组织类型对已发布公司目录进行细分，并显示每种类型的实时行数。",
        "input_schema": {
          "type": "object",
          "properties": {},
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "n": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "list_freelance_platforms",
        "title_en": "List the CV/profile platforms a consultant can sign up on",
        "title_zh": "列出顾问可以注册的简历/个人资料平台",
        "description_en": "List platforms where a consultant can create a profile, with signup URL, editorial confidence grade and assessment date.",
        "description_zh": "列出顾问可以创建个人资料的平台，包括注册URL、编辑置信度和评估日期。",
        "input_schema": {
          "type": "object",
          "properties": {
            "country": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "description": "ISO-3166-1 alpha-2 country code, e.g. DE, FR, CH."
            },
            "platform_type": {
              "type": "string",
              "description": "Restrict to one platform type, lowercase snake_case. The live vocabulary with counts is `_meta.available_platform_types` on every response — a well-formed unknown value returns no rows, it never widens the result."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "platform_type": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "signup_url": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The platform's own signup/profile-creation page, verified on assessed_at."
                  },
                  "hq_country": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "confidence": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Editorial confidence in the signup assessment."
                  },
                  "assessed_at": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "list_sap_modules",
        "title_en": "SAP analytics module taxonomy",
        "title_zh": "SAP分析模块分类",
        "description_en": "Canonical SAP module/product taxonomy Analytics Legends classifies against, with codes and EN/FR labels by category.",
        "description_zh": "Analytics Legends用于分类的规范SAP模块/产品分类，包含代码和按类别的英文/法文标签。",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "code": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "label_en": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "category": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "list_studies",
        "title_en": "List the deep-research studies (metadata only)",
        "title_zh": "列出深度研究（仅元数据）",
        "description_en": "List deep-research studies with edition, as-of date, audience, word count and canonical URL. Metadata only.",
        "description_zh": "列出深度研究，包括版本、截止日期、受众、字数和规范URL。仅元数据。",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "lang": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "description": "Language code, EN or FR."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "as_of": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "word_count": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "access": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "query_knowledge_graph",
        "title_en": "Traverse the learning knowledge graph",
        "title_zh": "遍历学习知识图谱",
        "description_en": "Query relations between teaching objects: which module teaches which concept, which study covers which module, etc.",
        "description_zh": "查询教学对象之间的关系：哪个模块教授哪个概念，哪个研究涵盖哪个模块等。",
        "input_schema": {
          "type": "object",
          "properties": {
            "node_id": {
              "type": "string",
              "description": "Fully-qualified node id, `<type>:<id>` — `module:M178`, `concept:C001`, `study:ai-impact-2026-EN`, `vendor:alteryx`. With it, rows are that node's EDGES (one row per neighbour). Without it, rows are NODES."
            },
            "node_type": {
              "type": "string",
              "description": "Restrict to one carried node type: concept · module · study · vendor. Read `_meta.available_node_types`."
            },
            "edge_type": {
              "type": "string",
              "description": "Restrict a walk to one relation. The served projection carries FIVE — teaches · taught_by · covers · related · mentions — and this list is a HINT, not the authority: read `_meta.available_edge_types`, computed on every call. A four-name list stood here while the projection served five, so `mentions` was reachable and undocumented."
            },
            "direction": {
              "type": "string",
              "enum": [
                "from",
                "to",
                "both"
              ],
              "description": "Which side of the edge `node_id` must sit on. Default `both`. Ignored without `node_id`, and the response says so rather than pretending it applied."
            },
            "query": {
              "type": "string",
              "description": "Case-insensitive substring of a node's label. Applies to the NODE listing, not to a walk."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "node_id": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "node_type": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "label": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "edge_type": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Present only on a walk (when `node_id` was given)."
                  },
                  "direction": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "`out` = node_id → neighbour, `in` = neighbour → node_id. Walk rows only."
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "search_concepts",
        "title_en": "Search the SAP analytics concept encyclopaedia",
        "title_zh": "搜索SAP分析概念百科全书",
        "description_en": "Search the SAP analytics concept encyclopaedia, returning slug, title, category, level, tags and editor's summary.",
        "description_zh": "搜索SAP分析概念百科全书，返回slug、标题、类别、级别、标签和编辑摘要。",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "category": {
              "type": "string",
              "description": "Concept category, matched case-insensitively as an exact value OR a prefix — so category:\"datasphere\" reaches 'Datasphere Core'. The values are long human labels, not codes. DO NOT GUESS THEM FROM THIS TEXT: the live vocabulary with a row count per label comes back as `_meta.available_categories` on EVERY call, including a call that matched nothing. A list written here would say 14 labels with 2026-07-30 counts; the corpus holds 15 today, and five of those counts have moved. Read the envelope, not the prose."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "search_firms",
        "title_en": "Search the SAP analytics firm directory",
        "title_zh": "搜索SAP分析公司目录",
        "description_en": "Search the published Analytics Legends directory of SAP analytics service providers by country, kind, declared SAP module and free text. Returns name, HQ country/city, website, careers URL and a one-line editorial claim. Paginated.",
        "description_zh": "按国家、类型、声明的SAP模块和自由文本搜索已发布的Analytics Legends SAP分析服务提供商目录。返回名称、总部国家/城市、网站、职业URL和一行编辑声明。分页。",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "country": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$",
              "description": "ISO-3166-1 alpha-2 country code, e.g. DE, FR, CH."
            },
            "kind": {
              "type": "string",
              "enum": [
                "agency_placement",
                "professional_services_big4",
                "professional_services_esn",
                "vendor_sap",
                "vendor_partner",
                "platform_marketplace",
                "community_group",
                "client_enterprise",
                "other"
              ],
              "description": "Restrict to one organisation kind. This list is the vocabulary the corpus holds today, not a frontier — call list_firm_kinds for the live one. A malformed code is refused; a well-formed code the corpus does not hold returns no rows. Neither case is silently ignored, and neither widens the result."
            },
            "module": {
              "type": "string",
              "description": "Restrict to organisations with a DECLARED link to one SAP module/product code (UPPERCASE snake_case, e.g. DATASPHERE, BDC, SAC, BW4HANA, S4HANA, JOULE — case-insensitive on input). The declared links are structured data, far more selective than free text: `count_firms_by {by:\"module\"}` gives the live vocabulary with counts. A minority of the directory declares any module at all, so this filter finds the DECLARED specialists — absence from the result means no declared link, never that the firm does not work on the module."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "kind": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "hq_country": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "hq_city": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "region": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "website": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "jobs_url": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "claim": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "size_bracket": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "founded_year": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "sap_signal_band": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "last_verified_at": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      },
      {
        "name": "search_news",
        "title_en": "Search SAP analytics market news",
        "title_zh": "搜索SAP分析市场新闻",
        "description_en": "Search the Analytics Legends market-news corpus, watched for SAP analytics but not all-SAP; returns items with citation URLs.",
        "description_zh": "搜索Analytics Legends市场新闻语料库，关注SAP分析但不限于SAP；返回带有引用URL的条目。",
        "input_schema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "maxLength": 200,
              "description": "Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
            },
            "category": {
              "type": "string",
              "description": "Category code, matched case-insensitively. The live vocabulary is NOT written here — read `_meta.available_categories` on any response: every category label this corpus holds right now, with its active-row count, counted at query time. A written list held 21 values while the corpus held 22. One bucket needs a warning. 'SAC' is the noisiest label in this corpus because the acronym collides with unrelated ones — Windows 'Smart App Control', and the surname 'Sacks'. A 2026-07-30 cleanup reclassified half that bucket to AI for carrying no SAP signal at all; the collision pressure is structural and the bucket has kept growing since. For genuine SAC product news, pair category:'SAC' with query:'analytics cloud'."
            },
            "published_since": {
              "type": "string",
              "description": "Lower bound on `published_at`, inclusive, as YYYY-MM-DD. Without a bound a period question is only answerable by walking pages — and `_meta.match_count` then counts the QUERY, not the period, so any figure quoted for the window would be wrong."
            },
            "published_until": {
              "type": "string",
              "description": "Upper bound on `published_at`, INCLUSIVE of the day named, as YYYY-MM-DD. Combine with `published_since` for a window; `_meta.match_count` then describes that window, which is what makes it quotable."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10,
              "description": "Max rows (hard cap 50)."
            },
            "cursor": {
              "type": "string",
              "maxLength": 512,
              "description": "Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
            }
          },
          "additionalProperties": false
        },
        "output_schema": {
          "type": "object",
          "properties": {
            "tool": {
              "type": "string"
            },
            "result_count": {
              "type": "integer"
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "published_at": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "source_name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "source_url": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "citation_url": {
                    "type": "string"
                  },
                  "citation_scope": {
                    "type": "string",
                    "enum": [
                      "record",
                      "section_hub"
                    ]
                  }
                }
              }
            },
            "_meta": {
              "type": "object"
            },
            "_attribution": {
              "type": "string"
            }
          },
          "required": [
            "tool",
            "result_count",
            "rows",
            "_attribution"
          ]
        },
        "unit_kind": "mcp_tool",
        "effect": "read",
        "open_world": false,
        "idempotency": "idempotent",
        "confirmation": "explicit policy",
        "evidence_ids": [
          "protocol-tools"
        ],
        "runtime_auth": {},
        "pricing": {},
        "metadata": {}
      }
    ],
    "review_profile": {
      "schema_version": "aiworkshub.resource-review/0.2",
      "method_version": "capability-evidence-v2",
      "review_state": {
        "identity": "verified",
        "source": "verified",
        "connectivity": "verified",
        "contract": "strong",
        "safe_use": "tested",
        "real_use": "unobserved"
      },
      "assessment": {
        "capability_definition": "strong",
        "contract_completeness": "strong",
        "access_friction": "low",
        "operational_transparency": "strong",
        "evidence_strength": "protocol_inspected",
        "use_readiness": "ready_for_guidance"
      },
      "profile": {
        "capabilities": [
          {
            "id": "data.search",
            "weight": 90,
            "confidence": 95,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          },
          {
            "id": "data.retrieve",
            "weight": 90,
            "confidence": 95,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          },
          {
            "id": "data.analyze",
            "weight": 80,
            "confidence": 90,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          },
          {
            "id": "data.discover",
            "weight": 70,
            "confidence": 85,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          },
          {
            "id": "knowledge.retrieve",
            "weight": 70,
            "confidence": 85,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          }
        ],
        "domains": [
          {
            "id": "sap-analytics",
            "weight": 100,
            "confidence": 95,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          },
          {
            "id": "market-intelligence",
            "weight": 80,
            "confidence": 90,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          },
          {
            "id": "recruitment",
            "weight": 60,
            "confidence": 80,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          },
          {
            "id": "training",
            "weight": 50,
            "confidence": 75,
            "evidence_ids": [
              "source-record",
              "protocol-tools"
            ]
          }
        ],
        "workflow_roles": [
          "discover",
          "retrieve",
          "analyze"
        ]
      },
      "capability_units": [
        {
          "id": "tool:search_firms",
          "kind": "mcp_tool",
          "capability_id": "data.search",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "text query",
            "country code",
            "kind enum",
            "module code",
            "pagination cursor"
          ],
          "produces": [
            "firm records with metadata"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:count_firms_by",
          "kind": "mcp_tool",
          "capability_id": "data.analyze",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "facet enum",
            "optional filters"
          ],
          "produces": [
            "counts per bucket"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:get_firm",
          "kind": "mcp_tool",
          "capability_id": "data.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "slug"
          ],
          "produces": [
            "firm profile"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:list_firm_kinds",
          "kind": "mcp_tool",
          "capability_id": "data.discover",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [],
          "produces": [
            "kind counts"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:list_freelance_platforms",
          "kind": "mcp_tool",
          "capability_id": "data.search",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "country code",
            "platform type",
            "pagination cursor"
          ],
          "produces": [
            "platform records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:find_opportunities",
          "kind": "mcp_tool",
          "capability_id": "data.search",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "text query",
            "location",
            "country code",
            "employment type",
            "remote mode",
            "pagination cursor"
          ],
          "produces": [
            "job posting records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:search_news",
          "kind": "mcp_tool",
          "capability_id": "data.search",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "text query",
            "category",
            "date range",
            "pagination cursor"
          ],
          "produces": [
            "news article records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:search_concepts",
          "kind": "mcp_tool",
          "capability_id": "knowledge.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "text query",
            "category",
            "pagination cursor"
          ],
          "produces": [
            "concept metadata records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:get_concept",
          "kind": "mcp_tool",
          "capability_id": "knowledge.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "slug"
          ],
          "produces": [
            "concept metadata and summary"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:list_studies",
          "kind": "mcp_tool",
          "capability_id": "data.discover",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "text query",
            "language",
            "pagination cursor"
          ],
          "produces": [
            "study metadata records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:get_day_rate_benchmark",
          "kind": "mcp_tool",
          "capability_id": "data.retrieve",
          "effect": "read",
          "open_world": true,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "country code",
            "specialisation",
            "seniority"
          ],
          "produces": [
            "rate benchmark records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:list_sap_modules",
          "kind": "mcp_tool",
          "capability_id": "knowledge.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "text query",
            "pagination cursor"
          ],
          "produces": [
            "module taxonomy records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:find_academy_modules",
          "kind": "mcp_tool",
          "capability_id": "data.search",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "text query",
            "track",
            "level",
            "pagination cursor"
          ],
          "produces": [
            "academy module catalogue records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:query_knowledge_graph",
          "kind": "mcp_tool",
          "capability_id": "data.analyze",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "node id",
            "node type",
            "edge type",
            "direction",
            "text query",
            "pagination cursor"
          ],
          "produces": [
            "graph nodes and edges"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:get_concept_card",
          "kind": "mcp_tool",
          "capability_id": "knowledge.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "slug"
          ],
          "produces": [
            "full concept card"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:get_study",
          "kind": "mcp_tool",
          "capability_id": "knowledge.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "slug",
            "language",
            "section"
          ],
          "produces": [
            "study sections"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:get_academy_module",
          "kind": "mcp_tool",
          "capability_id": "knowledge.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "module id or slug"
          ],
          "produces": [
            "full academy module"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:find_sap_clients",
          "kind": "mcp_tool",
          "capability_id": "data.search",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "text query",
            "country code",
            "industry",
            "product enum",
            "pagination cursor"
          ],
          "produces": [
            "SAP end-customer records"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:get_sap_client_profile",
          "kind": "mcp_tool",
          "capability_id": "data.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "id"
          ],
          "produces": [
            "SAP end-customer profile"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        },
        {
          "id": "tool:get_firm_intel",
          "kind": "mcp_tool",
          "capability_id": "data.retrieve",
          "effect": "read",
          "open_world": false,
          "idempotency": "idempotent",
          "confirmation": "explicit policy",
          "input_contract": "typed",
          "output_contract": "typed",
          "accepts": [
            "name",
            "country code",
            "delivers enum",
            "mode enum",
            "pagination cursor"
          ],
          "produces": [
            "firm intelligence profile"
          ],
          "runtime_auth": {},
          "pricing": {},
          "evidence_ids": [
            "protocol-tools"
          ],
          "metadata": {}
        }
      ],
      "access": {},
      "operational_flags": [],
      "trust": {
        "signal": "none",
        "evidence_ids": [],
        "reason": "No suspicious or malicious evidence."
      },
      "fit": {
        "good_for": [
          "SAP analytics market research",
          "Finding SAP service providers and end customers",
          "Searching SAP job opportunities",
          "Learning SAP analytics concepts and training"
        ],
        "not_for": [
          "General SAP news (corpus is not all-SAP)",
          "Certification data (not provided)",
          "Contacting individuals (never served)"
        ]
      },
      "evidence": [
        {
          "id": "source-record",
          "type": "registry_record",
          "source": "https://github.com/analyticslegends/analytics-legends-mcp",
          "observation": "MCP source record for Analytics Legends — SAP Analytics Intelligence; version 1.0.6.",
          "observed_at": null,
          "payload": {}
        },
        {
          "id": "protocol-tools",
          "type": "protocol_observation",
          "source": "https://analyticslegends.ai/mcp#tools/list",
          "observation": "20 tools were returned by MCP discovery; 20 were retained for review.",
          "observed_at": "2026-09-03T06:20:01.619Z",
          "payload": {}
        }
      ],
      "unknowns": [
        "Exact pricing details for Legend tier not specified in evidence.",
        "Real-world usage patterns not observed.",
        "Data freshness and update frequency not fully verified."
      ],
      "id": "REV_29AD67E74903",
      "resource_id": "RES_44263379B6DF",
      "evaluator_type": "platform_ai",
      "provider": "deepseek",
      "model": "deepseek-v4-flash",
      "review_scope": "protocol-inspected-mcp",
      "created_at": "2026-09-03T06:32:04.697Z"
    }
  }
}