Back to Browse

Disclosures MCP Server

Developer ToolsLow Risk10.0MCP RegistryLocal
Free

Server data from the Official MCP Registry

Corporate-disclosure research across 11 official sources behind seven jurisdiction-agnostic tools.

About

Corporate-disclosure research across 11 official sources behind seven jurisdiction-agnostic tools.

Security Report

10.0
Low Risk10.0Low Risk

Valid MCP server (1 strong, 1 medium validity signals). No known CVEs in dependencies. Package registry verified. Imported from the Official MCP Registry.

5 files analyzed · 1 issue found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

file_system

Check that this permission is expected for this type of plugin.

What You'll Need

Set these up before or after installing:

Descriptive User-Agent with contact info, required by SEC EDGAR (e.g. 'Your Org you@example.com'). SEC_EDGAR_USER_AGENT is also accepted.Optional

Environment variable: DISCLOSURES_USER_AGENT

UK Companies House API key. Required only for GB operations.Required

Environment variable: COMPANIES_HOUSE_API_KEY

South Korea OpenDART API key. Required only for KR operations.Required

Environment variable: OPENDART_API_KEY

Japan EDINET API key. Required only for JP document search; JP resolution is keyless.Required

Environment variable: EDINET_API_KEY

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "io-github-carrotly-ai-disclosures": {
      "env": {
        "EDINET_API_KEY": "your-edinet-api-key-here",
        "OPENDART_API_KEY": "your-opendart-api-key-here",
        "DISCLOSURES_USER_AGENT": "your-disclosures-user-agent-here",
        "COMPANIES_HOUSE_API_KEY": "your-companies-house-api-key-here"
      },
      "args": [
        "-y",
        "disclosures"
      ],
      "command": "npx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

disclosures

Corporate-disclosure research for AI agents and TypeScript — filings, insiders, owners, financials, and ownership chains from 11 official sources across 9 jurisdictions.

npm version CI License: Apache-2.0 Node >= 18 Zero runtime dependencies MCP Registry

disclosures is a free, open-source Model Context Protocol server and a TypeScript library. It answers questions like "who are NVIDIA's directors?", "who owns 5% of Samsung Electronics?", or "show me Vale's last three annual results" — with every answer linked back to the official source document.

  • 7 stable tools, 9 jurisdictions — one jurisdiction parameter routes each intent to the right national source. Tool names and schemas never change as coverage grows.
  • Official sources only — SEC EDGAR, GLEIF, UK Companies House, FCA NSM, filings.xbrl.org, Korea DART, Japan EDINET, China cninfo, India BSE, Taiwan TWSE, Brazil CVM.
  • Honest by design — real source links only, explicit "unsupported here" answers instead of empty or fabricated results, and clear caveats ("absence of a filing is not proof").
  • Zero runtime dependencies — one bundled file, runs anywhere Node 18+ runs.

Quick start

Requires Node 18+. The only required configuration is a descriptive User-Agent for SEC EDGAR (their fair-access policy) — set it to your name/org and contact email.

npx -y disclosures

Claude Code

claude mcp add --transport stdio disclosures \
  --env DISCLOSURES_USER_AGENT="Your Organization your-email@example.com" \
  -- npx -y disclosures

Claude Desktop

Add to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "disclosures": {
      "command": "npx",
      "args": ["-y", "disclosures"],
      "env": {
        "DISCLOSURES_USER_AGENT": "Your Organization your-email@example.com"
      }
    }
  }
}

Cursor

Add the same mcpServers block as Claude Desktop to ~/.cursor/mcp.json (or per-project .cursor/mcp.json).

VS Code (Copilot / MCP)

Add to .vscode/mcp.json:

{
  "servers": {
    "disclosures": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "disclosures"],
      "env": {
        "DISCLOSURES_USER_AGENT": "Your Organization your-email@example.com"
      }
    }
  }
}

Windsurf (~/.codeium/windsurf/mcp_config.json) uses the same mcpServers JSON as Claude Desktop.

Codex CLI (~/.codex/config.toml):

[mcp_servers.disclosures]
command = "npx"
args = ["-y", "disclosures"]
env = { DISCLOSURES_USER_AGENT = "Your Organization your-email@example.com" }

Gemini CLI (~/.gemini/settings.json) uses the same mcpServers JSON as Claude Desktop.

Any other client: run npx -y disclosures as a stdio command with the DISCLOSURES_USER_AGENT environment variable set. The server speaks newline-delimited JSON-RPC on stdout. It is also listed on the official MCP registry as io.github.carrotly-ai/disclosures.

Restart the client after changing its configuration, then try:

"Use disclosures to list Apple's board of directors and their latest Form 4 activity." "Who holds 5% or more of NVIDIA? Link the filings." "Resolve Samsung Electronics in Korea and show its latest annual financials." "What's the GLEIF ownership chain above Apple Operations India?"

The seven tools

ToolWhat it answersCoverage
CompanyResolve"Which company is this?" — canonical name plus CIK, ticker, LEI, ISIN, and local registry identifiers.US, GB, KR, JP, CN, IN, TW, BR + global LEI/ISIN
CompanyFilings"What has it filed?" — dates, types, descriptions, direct source links; a latest annual/quarterly report mode.US, GB, KR, JP, CN, IN, TW, BR
CompanyInsiders"Who runs it?" — directors, officers, titles, and 10%+ owners from insider registers.US, GB (incl. ECCTA identity status), KR, TW
CompanyOwners"Who owns it?" — major-shareholder filers with thresholds, dates, and filing links.US (13D/13G), GB (PSC + TR-1), KR (5% rule), JP (5% rule / 大量保有報告書), TW (>10%)
CompanyFinancials"What are its numbers?" — annual as-filed revenue, income, balance sheet, EPS, cash flow by fiscal period.US (XBRL), GB/EU (ESEF/UKSEF IFRS), KR, BR
OwnershipChain"Who consolidates it?" — GLEIF direct/ultimate accounting-consolidation parents and children.🌐 Global (any LEI or legal name)
PrivateRaises"Has it raised privately?" — Form D exempt offerings, amounts, investor counts, named related persons.US only in v1

Every company input accepts a name or a local identifier — ticker, CIK, LEI, or ISIN (US/global), Companies House number (GB), OpenDART corp/stock code (KR), EDINET/securities/corporate code (JP), A-share or HK code (CN), BSE scrip (IN), TWSE listing code (TW), CVM registration code (BR). Pass jurisdiction: "US" | "GB" | "EU" | "KR" | "JP" | "CN" | "IN" | "TW" | "BR" (default US).

Coverage matrix

IntentUSGBEUKRJPCNINTWBR
CompanyResolve
CompanyFilings
CompanyInsiders
CompanyOwners
CompanyFinancials
PrivateRaises
OwnershipChain🌐 global via GLEIF — jurisdiction-independent

✅ supported · — returns an honest unsupported-jurisdiction explanation, never an empty or fabricated result

Each jurisdiction has a full reference page — data source, credentials, accepted identifiers, per-intent behavior, and caveats — under docs/jurisdictions/.

Data sources and credentials

US and global lookups work with just the User-Agent. Non-US sources are keyless where the upstream allows it; the two that need keys are free. Provide only the keys for jurisdictions you query — everything else keeps working without them, and a missing credential produces a readable error naming the exact variable to set.

SourceJurisdictionKey requiredNotes
SEC EDGARUS (default)None — set DISCLOSURES_USER_AGENTFilings, insiders, 13D/13G owners, XBRL financials, Form D.
GLEIF🌐 globalNoneLEI/ISIN resolution, ownership chain.
Companies HouseGBCOMPANIES_HOUSE_API_KEY (free)Resolution, filings, officers, PSC — incl. ECCTA identity-verification status.
FCA NSMGBNone — inject-onlyDTR5/TR-1 ~3%+ major holdings inside CompanyOwners; activates only when you inject a fetchFn (no public read API).
filings.xbrl.orgGB, EUNoneESEF/UKSEF normalized annual IFRS financials (FY2020+).
DART / OpenDARTKROPENDART_API_KEY (free)Resolution, reports, executive ownership, 5% mass holdings, financials.
EDINETJPEDINET_API_KEY (free, search only)Resolution is keyless; document search needs the key.
cninfoCNNoneSSE/SZSE (+ HKEX mirror) resolution and announcement PDFs.
BSE IndiaINNoneResolution and announcement PDFs; anti-bot host — inject a fetchFn if throttled.
TWSE OpenAPITWNoneResolution, material information, directors/supervisors, >10% shareholders.
CVM open dataBRNoneResolution, IPE disclosure index, DFP annual financials in BRL.
# Required (SEC fair-access policy — your name/org and contact email)
export DISCLOSURES_USER_AGENT="Your Organization your-email@example.com"

# Optional, per jurisdiction
export COMPANIES_HOUSE_API_KEY="..."   # GB
export OPENDART_API_KEY="..."          # KR
export EDINET_API_KEY="..."            # JP document search

SEC_EDGAR_USER_AGENT is accepted as a fallback for compatibility; DISCLOSURES_USER_AGENT wins.

Use as a TypeScript library

The same package imports cleanly without starting stdio — every adapter takes injectable { fetchFn?, env?, cache? }, so it embeds and tests deterministically.

import { createTools } from "disclosures";

const tools = createTools({
  env: { DISCLOSURES_USER_AGENT: "Your Organization your-email@example.com" },
});

const resolve = tools.find((tool) => tool.name === "CompanyResolve")!;
const result = await resolve.handler({ company: "NVDA" });

Handlers never throw — every failure comes back as a readable MCP-shaped result. Individual adapters are also exported as namespaces (secEdgar, gleif, companiesHouse, openDart, edinet, cninfo, bseIndia, fcaNsm, xbrlFilings, twseOpenApi, cvmOpenData) if you want the raw normalized records instead of Markdown.

The OpenDART corp-code list (KR) and EDINET code list (JP) are multi-megabyte archives that regenerate about daily. Without a cache they are memoized per process; supply one to persist across restarts:

import { FileCache, createTools } from "disclosures";

const tools = createTools({
  env: { OPENDART_API_KEY: process.env.OPENDART_API_KEY },
  cache: new FileCache("/var/cache/disclosures"), // TTL-aware, survives restarts
});

cache is any DisclosuresCache (get/set). InMemoryCache and FileCache ship in the box; a corrupt, expired, or missing entry degrades to a normal refetch — a broken cache never breaks a lookup.

import { gleif } from "disclosures";

gleif.isIsin("US0378331005");                               // true — validates the check digit
const issuer = await gleif.resolveLeiByIsin("US0378331005"); // → issuer's GLEIF Entity (with .lei)
const isins = await gleif.getIsinsForLei("HWUPKR0MPOU8FGXBT394"); // → every ISIN for that LEI

CompanyResolve already accepts a bare ISIN and routes it through this cross-walk; the helpers are for building your own identifier maps.

import { createDisclosuresServer } from "disclosures";

const server = createDisclosuresServer(); // McpServer with the seven tools registered

Importing the package never opens stdio; only the CLI entry point connects the transport.

Honesty and scope

These tools report public disclosures, faithfully — they are not KYC, UBO, or cap-table products:

  • Absence is not proof. No Form D doesn't mean a company never raised privately; a missing PSC doesn't prove no controller exists; a blank ECCTA identity field doesn't prove an officer is unverified.
  • GLEIF parents are accounting-consolidation relationships — not voting control, market-disclosure ownership, or ultimate beneficial ownership.
  • Schedule 13D/13G identifies filers at the 5% threshold; it is not a complete or continuously current capitalization table.
  • Section 16 insiders reflect recent Forms 3/4/5 and may not be a complete current roster.
  • Filings can be amended, restated, late, or tagged under alternate XBRL concepts — verify against the linked source documents.
  • Nothing here is legal, investment, accounting, or financial advice.

Resolution misses come back as plain "Could not find…" text; configuration, upstream, and rate-limit failures come back as flagged errors naming the fix. Every link is a real, resolvable source URL.

Documentation

PageContents
docs/jurisdictions/Per-jurisdiction reference: sources, credentials, accepted identifiers, per-intent behavior, caveats, and the coverage matrix.
docs/TESTING.mdThe offline testing discipline — routed fetch stubs, recorded fixtures, live smoke.
PUBLISHING.mdnpm trusted publishing and MCP-registry release automation.
CHANGELOG.mdRelease history.

Development

Requires Bun for development; the published artifact runs on Node 18+.

bun install
bunx tsc --noEmit     # strict typecheck
bun test              # 278 tests, fully offline — no live HTTP
bun run build         # bundles dist/server.mjs (zero runtime deps)
bun run test:stdio    # stdio integration against the built artifact

Tests never touch the network: routed fetch stubs throw on any unmatched request (testing discipline). An optional live smoke test exercises real upstreams:

DISCLOSURES_USER_AGENT="Your Organization your-email@example.com" bun run smoke:live

stdio rule: the server reserves stdout for JSON-RPC — contributor diagnostics must go to stderr, since console.log corrupts the MCP transport.

Roadmap

The seven tool names and schemas stay stable; new sources and deeper data dispatch behind the same intents rather than adding jurisdiction-specific tools. Next up: GB/JP insider depth, CN/IN ownership and financials currently locked inside report PDFs, and a DE (Germany) adapter — feasibility confirmed for CompanyResolve/CompanyOwners/CompanyInsiders over BaFin's free voting-rights and directors'-dealings databases. Suggestions and issues welcome on GitHub.

License

Apache-2.0. Copyright Carrotly AI.

Reviews

No reviews yet

Be the first to review this server!