nport
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nportShow me the top 10 holdings of Vanguard's Total Stock Market ETF"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
nport
Normalized fund holdings and service-provider graph built from SEC Form N-PORT and Form N-CEN, joined to the GLEIF LEI register, served to agents over MCP.
Design: docs/design.md. Empirical notes on the source data: docs/data-notes.md.
Status: ingest layer only. Raw and Parquet layers land end to end; the dbt transform, MCP server, and Terraform are not built yet.
Quickstart
uv sync
export SEC_USER_AGENT="Your Name your@email.com" # the SEC throttles anonymous traffic
uv run nport-ingest periods nport # what quarters are published upstream
uv run nport-ingest all # N-PORT + N-CEN + GLEIF, latest available
uv run nport-ingest status # what is landed, from the manifestsLanding all three sources takes a few minutes and writes ~1 GB under ./data.
To land a single source or an older quarter:
uv run nport-ingest land nport --period 2026q1
uv run nport-ingest land ncen --raw-only # skip Parquet conversion
uv run nport-ingest land gleif --force # re-download and re-convertRelated MCP server: civicgraph-mcp
Storage
NPORT_DATA_ROOT controls where everything goes and is the only difference
between local iteration and running in ECS:
export NPORT_DATA_ROOT=./data # default
export NPORT_DATA_ROOT=s3://my-bucket/nport # needs the `s3` extra: uv sync --extra s3Layout, per docs/design.md §2:
{root}/raw/{source}/{period}/{archive}.zip original bytes, immutable
{root}/parquet/{table}/period={period}/data.parquet zstd, all columns VARCHAR
{root}/parquet/_manifest/{source}/period={period}/
manifest.json source URL, raw SHA-256, per-table row counts
schema.json column names, types, descriptions and PKs, from the
CSVW sidecar the SEC ships inside each archiveRe-running a landed period is a no-op unless --force is passed, which makes
the task safe to retry from a schedule. If the SEC republishes a quarter under
the same filename, the run warns that the byte count moved rather than silently
serving stale data.
Design decisions in the ingest layer
Every Parquet column is VARCHAR. Typing belongs in dbt staging/. The
sources are full of values that break type inference — dates as 28-FEB-2026,
numbers as -.0091723714, and N/A appearing in numeric columns — so
inference here would either fail or silently coerce, and it would put business
logic in the one layer that has to stay reproducible from raw bytes.
Download URLs are discovered, not constructed. Most SEC archives follow
{period}_{source}.zip, but several N-CEN quarters shipped as
2025q1_ncen_0.zip after a republish. The index page is scraped for hrefs, with
the conventional pattern as a fallback.
The archives' own schema metadata is extracted. Both SEC ZIPs contain a CSVW
*_metadata.json declaring per-table primary keys, column types and column
descriptions. That is the authoritative input for the grain assertions in
transform/, so it is written out as schema.json rather than left in a ZIP.
Layout
src/nport/ingest/ fetch -> validate -> land as Parquet
sources/ one module per upstream source
convert.py ZIP of delimited text -> Parquet, via DuckDB
land.py orchestration and manifests
storage.py URI addressing over fsspec (local or S3)
transform/ dbt project (dbt-duckdb) [not built]
src/nport/server/ FastMCP server [not built]
evals/ scored question set [not built]
infra/ Terraform [not built]Development
uv run ruff check src/ && uv run ruff format src/
uv run pytestThis server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA 'Server of Servers' architecture that aggregates domain-specific financial data capabilities into a single governed interface. It enables users to access fund performance tools like returns, benchmark comparisons, and risk-adjusted metrics through a unified MCP-compliant gateway.
- AlicenseAqualityBmaintenanceA money-in-politics knowledge graph, as an MCP server. It links entities across federal campaign donations, lobbying disclosures, and government contracts.7MIT
- AlicenseAqualityBmaintenanceAn MCP server that wraps SEC EDGAR APIs to provide company financial data, screening metrics, and disclosure signals for investment diligence, with every figure traced to its source filing.8MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that reconstructs hedge-fund/superinvestor portfolios from SEC EDGAR 13F filings, offering tools to query fund holdings, consensus activity, and quarter-over-quarter changes through a read-only API.3AGPL 3.0
Related MCP Connectors
MCP server for nonprofit financials via ProPublica — IRS Form 990 data for 1.8M+ nonprofits.
Knowledge coverage map and health score. Ingest docs into a governed knowledge graph via MCP.
The Graph MCP — indexed blockchain data via subgraph GraphQL queries
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bensacc/nport-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server