Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Oxford Ledge

PYPI · OXFORD-LEDGE-MCP · 2 COMPONENTS · SCANNED SEP 30

Ask your assistant; it reads the public record: SEC filings, 13F, insider trades, BDC loans.

61 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to hs902/oxford-ledge-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 2 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability67
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 8275 tokens (~285/item across 29 items; 29 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 29 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 30 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities20
  • Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28. See how to fix → Fail

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Install

How do I install the Oxford Ledge MCP server?

Oxford Ledge runs locally as a PyPI package, launched with uvx oxford-ledge-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · oxford-ledge-mcp

# add to Claude Code
claude mcp add com-oxfordledge-oxford-ledge -- uvx oxford-ledge-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "com-oxfordledge-oxford-ledge": {
      "command": "uvx",
      "args": [
        "oxford-ledge-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-oxfordledge-oxford-ledge": {
      "command": "uvx",
      "args": [
        "oxford-ledge-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add com-oxfordledge-oxford-ledge -- uvx oxford-ledge-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-oxfordledge-oxford-ledge": {
      "type": "local",
      "command": [
        "uvx",
        "oxford-ledge-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-oxfordledge-oxford-ledge --command uvx --arg oxford-ledge-mcp
# ~/.hermes/config.yaml
mcp_servers:
  com-oxfordledge-oxford-ledge:
    command: "uvx"
    args: ["oxford-ledge-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-oxfordledge-oxford-ledge": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "oxford-ledge-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add com-oxfordledge-oxford-ledge -t stdio -c uvx -a oxford-ledge-mcp
// mcp.json
{
  "mcpServers": {
    "com-oxfordledge-oxford-ledge": {
      "command": "uvx",
      "args": [
        "oxford-ledge-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 30 Sept 26 −15
    • Malware scan: pass → unverified ▼ security
  • 29 Sept 26 +15
    • Malware scan: unverified → pass ▲ security
  • 28 Sept 26 −5
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 27 Sept 26 66

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 30 Sept 2026 · Analysed pypi/oxford-ledge-mcp@3.8.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo hs902/oxford-ledge-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/hs902/oxford-ledge-mcp/.github/workflows/publish.yml@refs/tags/v3.8.0
Rekor log index 2974641193
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:991a6a2f24dbfee6ca0bd568a2d7f7b2564f65ca2e6505268191a30018ff812e

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted setuptools.build_meta

Background: Why install scripts are a supply-chain risk →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 29 exposed · ~8,163 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
get_13f_holdings ~382

[Tier: free] What one institutional filer owns: the largest positions in its latest SEC 13F-HR, plus quarter-over-quarter changes. Accepts a numeric CIK (preferred) or a ticker resolved via SEC's company map (BLK; BRK-B or BRK.B for Berkshire). A filer NAME is NOT resolved by this package -- pass the CIK. Returns {cik, fundName, filingDate, periodOfReport, totalHoldings, totalValue, holdings}; each holding is {name, title_of_class, value (whole USD), shares, type, position_type, lots, ticker}. `position_type` is COM|PRN|PUT|CALL: do NOT sum across types. `holdings` is truncated to max_holdings (default 50, cap 500) while the totals cover the whole filing. Source: SEC EDGAR 13F-HR, ~45-day quarterly delay; heavy operation, max 2 concurrent. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
fundstringyesFund CIK number (e.g. 1067983 for Berkshire Hathaway) -- preferred. A ticker is resolved via SEC's company map: letters with at most one class suffix (e.g. BLK, or BRK-B / BRK.B -- SEC lists Berkshir…
max_holdingsinteger–Maximum number of holdings to return (default 50, cap 500)

No output schema declared.

No examples provided.

get_activist_stakes ~235

[Tier: free] Schedule 13D/13G >5% beneficial-owner filings for a ticker -- event-driven stake-building, unlike quarterly 13F. Returns {ticker, count, filings}, newest first, limit default 50 (hard cap 200); rows carry filer_name, filing_date, form_type, shares, percent_of_class, accession_number and is_activist (a FORM-TYPE label: true iff the form is a 13D, not a judgement). `reports_zero` is the filer's own statement that it no longer owns more than 5% -- an exit OR a reporting realignment, so cross-check get_holders before reading it as a sale. FRESHNESS: keyless callers are served STORED rows and never trigger the EDGAR refresh -- read `stale` and `stale_basis`. Source: SEC EDGAR. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
limitinteger–Max filings to return (default 50)
tickerstringyesStock ticker symbol (e.g. AAPL)

No output schema declared.

No examples provided.

get_bdc_borrower_mark_history ~240

[Tier: free] Multi-quarter fair-value mark history for one borrower across every BDC that holds its debt, NEWEST QUARTER FIRST: per-quarter min/max and par-weighted average marks (percent of par, 2dp), holding-row and holder counts, and the contributing BDC tickers. Returns {borrowerNorm, count, quarters, units}. Exact borrower_norm match only -- resolve the key with search_bdc_borrower first. ABOVE-PAR TRAP: a mark above 100 is a par-basis artifact until fair value is checked against cost on the holding rows (get_bdc_holdings), NOT a credit premium. ATTRIBUTION: Oxford Ledge's parse of SEC EDGAR BDC schedules of investments (ol-derived), not a filer-published series. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
borrower_normstringyesNormalized borrower key, matched EXACTLY (take borrowerNorm from a search_bdc_borrower result)
quartersinteger–Most-recent quarters to return (1-16, default 8)

No output schema declared.

No examples provided.

get_bdc_holdings ~332

[Tier: free] Full portfolio holdings for one BDC's latest SEC filing: borrower, industry, security type, lien position, rate, maturity, par/cost/fair value and mark per position, plus portfolio-level totals, structure metrics and `topIndustries`. Money is whole USD; marks are percent of par. `totalFairValue` is ARBITRATED: read `fairValueBasis` and `fairValueRefused` first. ABOVE-PAR TRAP: a mark above 100 is a par-basis artifact until fairValue is checked against costAmount, NOT a credit premium. A large book serialises past 100,000 characters: `limit` / `offset` page the `holdings` rows while every total stays computed over the whole book, and nothing is dropped to fit. The totals, structure metrics and arbitration are Oxford Ledge's parse of SEC EDGAR schedule-of-investments filings (10-Q/10-K), not filer-published figures. `ticker` is required. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
limitinteger–Max `holdings` rows to return (default 5000 = every row; hard cap 5000, refused above). Pages the row list only.
offsetinteger–Rows to skip before the page (default 0; max 5000). Past the end returns an empty page with `page.total` intact.
tickerstringyesBDC ticker symbol (e.g. ARCC, OBDC — see get_bdc_list)

No output schema declared.

No examples provided.

get_bdc_list ~221

[Tier: free] Roster of the ACTIVE BDCs tracked by Oxford Ledge, sorted by portfolio size -- our coverage, not the whole BDC universe; wound-down issuers are excluded by design. No arguments. Returns {bdcs}; per BDC: ticker, name, listed, holdingCount, totalFairValue (whole USD, latest filing), filingDate, lastParsed and a reconciliation block (reportedTotalFairValue, fairValueBasis, parsedRowSumFairValue, fairValueRefused, fairValueGap, fairValueGapNote). READ fairValueBasis BEFORE using totalFairValue, and fairValueGap with it: an under-counting parse keeps the parsed-row sum, which UNDERSTATES the book. holdingCount, totalFairValue and the arbitration are Oxford Ledge's parse, not filer-published figures. Borrower-keyed counterpart: search_bdc_borrower. Source: SEC EDGAR BDC filings (Oxford Ledge parse). Caveats ride the response's tool_notes. [Requires API mode]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_capital_allocation ~305

[Tier: plus] Where a company sent its cash, up to 30 annual labels, from SEC EDGAR XBRL cash-flow tags (the hosted scorecard tool, proxied by name). Returns {ticker, capitalAllocation:{years, periods, dividends, netBuybacks, grossRepurchases, netDebtChange, acquisitions, sharesOut, isDilutive, basis, summary}} as PARALLEL ARRAYS aligned to `years` (newest first, fiscal labels). netBuybacks is a NET, DERIVED DILUTION PROXY, not a buyback figure (repurchases minus issuance, IPO proceeds and SBC); grossRepurchases is the filed line. An IFRS reporter is REFUSED, never served zeros. The net series and the summary are Oxford Ledge derivations over the filed tags (basis hybrid); the inputs are the filing's. Complements get_fundamentals and get_debt_maturities. Source: SEC EDGAR XBRL cash-flow tags, 24h cache. Plus tier: the refusal is AUTH_REQUIRED naming the tier -- keyless, it says the client is anonymous and the operator sets OXFORD_LEDGE_API_KEY; with a valid key on a lower plan, it says THE KEY IS VALID and the plan is what is missing. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
tickerstringyesStock ticker symbol (e.g. AAPL)

No output schema declared.

No examples provided.

get_corporate_events ~290

[Tier: free] The 20 most recent 8-K item events for a ticker from Oxford Ledge's 8-K index of SEC EDGAR, NEWEST FIRST -- a fixed window with no caller-settable limit, so a recent-events feed, not a history. Returns {ticker, count, events, coverage, summary}; each event is {ticker, eventDate, eventType, headline, description, counterparty, counterpartyTicker, source, sourceUrl}. `eventType` is Oxford Ledge's 8-K item-to-category map (the one derived field); `description` is an excerpt of the filing text. `event_type` filters on the stored category; for M&A use acquisition_disposition. An unreachable store REFUSES rather than serving events=[]. `ticker` is required. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
event_typestring–Optional filter (lowercase, case-sensitive). 8-K item categories (material_agreement, acquisition_disposition, executive_change, shareholder_vote, ...) are what the 8-K writers actually store; divide…
tickerstringyesStock ticker symbol (e.g. AAPL)

No output schema declared.

No examples provided.

get_debt_maturities ~284

[Tier: plus] Forward debt maturity ladder parsed by Oxford Ledge from the latest 10-K/20-F footnote (the hosted EDGAR-only tool, proxied by name). Returns {ticker, maturities:[{year, amount}], thereafter, confidence, confidence_score, source, validation}. AMOUNTS ARE IN MILLIONS OF USD, not raw dollars -- 400 means $400M. THE LADDER IS AS OF the filing date, not today: the current-year bucket may already be repaid or refinanced. Check `validation` (the balance-sheet cross-check) before quoting a total. confidence / confidence_score / validation are Oxford Ledge's assessment of its own parse; the amounts are the filing's. EDGAR only -- no vendor debt totals and no modelled ladder. For historical issuance/repayment use get_capital_allocation. Source: SEC EDGAR 10-K note extraction. Plus tier: the refusal is AUTH_REQUIRED naming the tier -- keyless, it says the client is anonymous and the operator sets OXFORD_LEDGE_API_KEY; with a valid key on a lower plan, it says THE KEY IS VALID and the plan is what is missing. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
tickerstringyesStock ticker symbol (e.g. AAPL)

No output schema declared.

No examples provided.

get_fails_to_deliver ~301

[Tier: free] SEC fails-to-deliver history for one ticker -- the settlement-failure side of short pressure. Returns {ticker, days, history, count, coverage, as_of, summary}; each row is {date (settlement date), fails (SHARES, not dollars), price (USD), description}, OLDEST-FIRST. `days` (default 180, hard cap 730) is anchored to the latest LOADED settlement date (`as_of`), not to today. An empty or thin history describes the loaded SEC files, not an absence of fails: read `coverage` and `summary` before quoting a window as fail-free. Figures are as SEC published: NOT split-adjusted. Source: SEC Fails-to-Deliver dataset (published twice monthly, ~3-week lag). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
daysinteger–Trailing window in days (default 180, max 730), counted inclusively -- a 90-day window holds 90 settlement dates -- and ending at `as_of` unless end_date is given
end_datestring–ISO date (YYYY-MM-DD) the window ends on; default = the latest loaded settlement date (`as_of`). Pass today's date to measure against the calendar; a future date is clamped to today.
tickerstringyesStock ticker symbol (e.g. GME)

No output schema declared.

No examples provided.

get_fred_data ~298

[Tier: free] One FRED series' observations, read directly from the FRED API. Returns {series, name, units, frequency, data, count}; `data` is [{date, value}] NEWEST FIRST over the trailing `days` calendar days (default 365, 1..36500). Units vary BY SERIES, so read `units` before comparing anything. U.S.-government / public-domain series only, decided in three steps: a REFUSED roster of 14 ids with a known non-government rights holder (the ICE BofA OAS family, VIXCLS, UMCSENT, MICH, SP500, DJIA, NASDAQCOM, MORTGAGE30US, AAA) is refused with INVALID_PARAMS and NO request at all; a CLEARED roster of 40 reviewed federal series always serves; anything else is decided by FRED's own series metadata -- a third-party copyright notice or a named licensor is refused. Requires FRED_API_KEY; cached 1h. Caveats ride the response's tool_notes.

NameTypeReqDescription
daysinteger–Number of calendar days of history back from today (default 365; 1..36500)
seriesstringyesFRED series ID (e.g. GDP, UNRATE, CPIAUCSL, DFF); must match ^[A-Z0-9_.-]{1,40}$

No output schema declared.

No examples provided.

get_fundamentals ~261

[Tier: free] XBRL-parsed annual financial statements for one ticker, fetched directly from SEC EDGAR companyfacts (10-K, 20-F and 40-F filers reporting under US GAAP in USD). Returns {ticker, data, concepts, coverage, coverageNote, basis}; `data` maps Revenue, NetIncome, EPS, DilutedShares, TotalAssets, TotalLiabilities, StockholdersEquity, OperatingCashFlow and LongTermDebt -- to up to 10 annual {period, value} points, newest first, in whole USD (EPS in USD per share). `LongTermDebt` is NOT total debt. An EPS or share series that spans a stock split is withheld on the pre-split side ({value: null, withheld: 'split_basis'}), never rescaled; `basis` is Oxford Ledge's split-basis check and every other value is the filing's, verbatim. An IFRS reporter, or a Canadian MJDS filer reporting on 6-K in CAD, is refused as DATA_UNAVAILABLE. No key needed; cached 1h. Caveats ride the response's tool_notes.

NameTypeReqDescription
tickerstringyesStock ticker symbol (e.g. AAPL)

No output schema declared.

No examples provided.

get_holders ~220

[Tier: free] Top 10 institutional shareholders of a stock from SEC 13F-HR filings: common-stock (COM) positions only, one row per filer at that filer's LATEST 13F within the last 6 quarters, ranked by reported dollar value. Returns {ticker, holders, completeness}; each row carries holder, fund_cik, shares, value (whole USD), type, quarter, filingDate. One call can mix quarters: read `asOf`, `vintages` and `coverage` before comparing rows. A stale filer whose shares reconcile to same-quarter siblings of its own fund family is WITHHELD into `superseded_parents`; do NOT add those rows back into `holders` or into any total, which restores the double count the fold removes. An empty `holders` list is a scoped statement, not proof that nobody owns the stock. `ticker` is required. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
tickerstringyesStock ticker symbol

No output schema declared.

No examples provided.

get_insider_trades ~260

[Tier: free] Form 4 insider transactions for one issuer from Oxford Ledge's Form 4 ingest of SEC EDGAR: the latest `limit` rows by filing date (default 20, cap 100; `days` keeps rows filed in the last N days), every SEC transaction code. Returns {ticker, trades, completeness}; rows carry insider, position, signed shares, pricePerShare, value, type (raw SEC code), transTypeLabel, is_open_market (P and S only), isDerivative, transactionDate, filingDate, url. Rows with isDerivative true are option legs, awards or notes, not common-stock trades: do not add them to share counts. A 4/A that repeats its original line is served once (supersedesAccession names the folded original). Leave issuerSelfFiled rows out of any total. `ticker` is required. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
daysinteger–Only rows FILED in the last N days (optional; default: no window).
limitinteger–Max rows, newest filing first (default 20, hard cap 100).
tickerstringyesStock ticker symbol

No output schema declared.

No examples provided.

get_sec_filings ~189

[Tier: free] The 10 most recent EDGAR submissions for a company, of ANY form (Form 4 and Rule 144 notices dominate for large filers), unless `filing_type` narrows it to one exact form plus its /A amendments. Returns {ticker, filings, completeness}; each row is {form, title, date (filing date), url (the EDGAR document)}. The read covers only SEC's most-recent-1000 submissions index for the filer, so nothing older than `completeness.windowFrom` is visible here. Fetched directly from data.sec.gov (no key needed); cached 1h. Caveats ride the response's tool_notes.

NameTypeReqDescription
filing_typestring–Filing type filter (10-K, 10-Q, 8-K, etc). Optional.
tickerstringyesStock ticker symbol

No output schema declared.

No examples provided.

get_value_investing_fact ~238

[Tier: free] A value-investing principle, historical fact or attributed paraphrase from Oxford Ledge's curated corpus (~2,000 entries about Buffett, Graham, Munger, Klarman and others). THE WORDING IS NOT VERIFIED against the primary source: none is a verbatim quotation unless `verbatim` is true -- so never present the text as the author's exact words, and credit it with the `attribution` line. Returns a flat fact: {quote, author, source, source_year, category, subcategory, era, difficulty, verbatim, attribution}. Cached 24h per argument set -- vary `category` for a different pick. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
categorystring–Optional category, matched case-insensitively. The vocabulary is EXACTLY: principle, historical_fact, psychology, quote, case_study, contrarian, mistake. An unknown value returns a no-data error -- r…

No output schema declared.

No examples provided.

get_yield_curve ~241

[Tier: free] Current U.S. Treasury constant-maturity yield curve read directly from FRED's DGS series (1M, 3M, 6M, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 20Y, 30Y). Returns {yield_curve: {tenor: percent}, as_of: {tenor: observation date}, source}; values are PERCENT numbers (4.18 means 4.18%), the newest non-suppressed observation per tenor. include_history=true adds `yield_curve_1y_ago` (the observation nearest one year before each tenor's as_of, within 45 days) and `history_coverage`. A partial curve carries a `completeness` block naming the missing tenors; a curve with no readable tenor raises DATA_UNAVAILABLE. Verbatim FRED values, nothing derived. Requires FRED_API_KEY; cached 1h. Caveats ride the response's tool_notes.

NameTypeReqDescription
include_historyboolean–Include yield curve from 1 year ago for comparison (default false)

No output schema declared.

No examples provided.

ol_bdc_borrower_dispersion ~327

[Tier: free] MOAT: cross-lender loan-pricing DISPERSION for one private-credit borrower -- how N different BDCs each price the SAME loan (spread / mark / fair value); when one BDC marks a borrower S+550 @ 98 and another S+575 @ 99, the lenders disagree on the credit. Pass the canonical `borrower_norm` (from ol_bdc_top_borrowers or search_bdc_borrower). Returns {summary, borrower_norm, count, lender_count, tranche_count, lenders, ...}: ONE row per BDC lender, widest spread first, tranches nested. UNITS TRAP: `spread` is the raw as-filed number and mixes percent and bps across filers -- compare lenders on `spread_bps` only. Exited positions are excluded by default (include_stale=true shows them). Default 25 lenders, hard cap 100. Source: SEC EDGAR BDC schedules of investments (Oxford Ledge parse; ol-derived); FREE (no paywall on the hosted channel). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
borrower_normstringyesCanonical normalized borrower key (from ol_bdc_top_borrowers or borrower search).
include_staleboolean–Include lenders whose newest filing no longer names this borrower (stale marks). Default false.
limitinteger–Max LENDERS to return (default 25, hard cap 100); each lender's tranches ride nested.

No output schema declared.

No examples provided.

ol_bdc_common_borrowers ~344

[Tier: free] Borrowers common to a GIVEN SET of BDCs -- the cross-portfolio set question ('what do ARCC, OBDC and AGTC all lend to?') in ONE call. Returns per borrower: borrower, borrower_norm, holder_count, holder_tickers, holders ([{ticker, name}]), total_fair_value and total_par_amount in USD, and as_of_oldest/as_of_newest. Each BDC is read at ITS most recent filing, so rows MIX filing dates -- read as_of_range before treating the marks as contemporaneous. Debt positions only. Caps: more than 25 bdc_tickers is REFUSED as INVALID_PARAMS, limit 50/200, min_holders max 50. Feed a borrower_norm to ol_bdc_borrower_dispersion for cross-lender pricing. Source: SEC EDGAR BDC schedules of investments (Oxford Ledge parse -- ol-derived); FREE (no paywall on the hosted channel). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
bdc_tickersarrayyesBDC symbols to intersect, e.g. ["ARCC","OBDC","AGTC"] (max 25; more than 25 is refused as INVALID_PARAMS, nothing is truncated)
limitinteger–Max borrowers to return (default 50, max 200)
min_holdersinteger–Minimum number of the supplied BDCs that must hold the borrower (default 2, min 2 -- this answers what is SHARED; for one BDC's book use ol_bdc_top_borrowers)

No output schema declared.

No examples provided.

ol_bdc_credit_quality ~272

[Tier: free] BDC non-accrual credit-deterioration signal: the share of debt fair value on non-accrual (loans that stopped paying) in the latest filing, plus the trailing-quarter trend. Returns {summary, ticker, latest, trend}; `trend` is OLDEST-FIRST. flagged_pct is a percentage over the DETERMINATE-flag denominator, never total_debt_fv, and it is deliberately NULL (withheld, never zero) when determinate coverage is under 90% of debt fair value or the flag rate looks like a parse misread -- read `coverage_state` before reading flagged_pct. `quarters` default 12, hard cap 24. Pairs with ol_bdc_borrower_dispersion and ol_bdc_top_borrowers. ATTRIBUTION: Oxford Ledge's parse of SEC EDGAR BDC schedules of investments (ol-derived), not a filer-published series; FREE (no paywall on the hosted channel). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
quartersinteger–Trailing quarters of trend (default 12, hard cap 24).
tickerstringyesBDC ticker (e.g. ARCC, ORCC, FSK).

No output schema declared.

No examples provided.

ol_bdc_mark_changes ~325

[Tier: free] MOAT / private credit: the largest quarter-over-quarter MARK moves across a SET of BDC portfolios -- 'which borrowers got marked up or down the most last quarter, and by whom' in ONE deterministic call. Returns {increases, decreases}, each a global ranking; each row is {borrower, portfolio, prior_mark, latest_mark, mark_delta, prior_filing, latest_filing}. Marks are percent of par, fair-value-weighted across the BDC's tranches; mark_delta is in points. A borrower enters only when |mark_delta| >= 1.0 point and its fair value is >= $500k, so 'no moves' can hide small drifts. `coverage` names every BDC that was NOT read and why. bdc_tickers capped at 25; limit default 10 / hard 50 per direction. ATTRIBUTION: Oxford Ledge's parse of SEC EDGAR BDC schedules of investments (ol-derived), not a filer-published series; FREE (no paywall on the hosted channel). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
bdc_tickersarrayyesBDC symbols to compare, e.g. ["ARCC","FSK","OBDC"] (max 25; the excess is reported in `coverage.not_covered_detail` rather than dropped)
limitinteger–Rows per direction (default 10, hard cap 50). Ranking is GLOBAL across the supplied portfolios, not per BDC.

No output schema declared.

No examples provided.

ol_bdc_top_borrowers ~267

[Tier: free] MOAT / BDC discovery: the private-credit borrowers syndicated across the MOST BDCs, ranked by ACTIVE lender count (holder_count_active), then holder_count, then exposure -- the entrypoint for the BDC/private-credit category. Returns {summary, count, borrowers}; each row is {borrower, borrower_norm (the key other ol_bdc_* tools take), holder_count, total_fair_value (whole USD, latest filings), industry}. Feed a borrower_norm into ol_bdc_borrower_dispersion for cross-lender pricing. Caps: limit default 25 / hard 100; min_holders default 2 (max 50). An out-of-range `limit` is REFUSED, never clamped; the `completeness` block is the runtime truth on truncation. Source: SEC EDGAR BDC schedules of investments (Oxford Ledge parse; ol-derived); FREE (no paywall on the hosted channel). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
limitinteger–Max borrowers to return (default 25, hard cap 100).
min_holdersinteger–Minimum number of BDC lenders a borrower must appear in (default 2).

No output schema declared.

No examples provided.

ol_cftc_cot ~316

[Tier: free] CFTC Commitments-of-Traders positioning for THREE curated markets (keys gold, crude_oil, sp500). Pass `market` for its weekly history, NEWEST FIRST (names are normalised: 'wti', 'GOLD', 'e-mini s&p' resolve), or omit it for the latest report across the three. Returns {summary, market, matched_market, rows}. mm_* and open_interest are CONTRACT counts, not dollars, and mm_* cover ONE speculative category per report family (Managed Money for gold and crude_oil, Leveraged Funds for sp500). `limit` (series only) default 52, hard cap 156. Source: CFTC.gov (public domain); FREE (no paywall on the hosted channel). ATTRIBUTION: every field is CFTC verbatim EXCEPT market_key and market_label (Oxford Ledge's curated market catalog), matched_market and candidates (Oxford Ledge's resolver over that catalog) and mm_net (mm_long minus mm_short, computed by Oxford Ledge). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
limitinteger–Weekly reports for a market series (default 52, hard cap 156).
marketstring–Market key, CFTC report name or desk symbol -- gold / GC / XAU, crude_oil / CL / WTI, sp500 / ES / S&P (case-insensitive; omit for the latest all-market snapshot).

No output schema declared.

No examples provided.

ol_fdic_bank ~267

[Tier: free] FDIC-insured banks and thrifts. Pass `query` for a name PREFIX search against ACTIVE institutions (largest-asset first), or omit it for the largest active institutions. Returns {summary, query?, institutions}, each {cert, name, stname, city, bkclass, active, asset, dep, estymd, webaddr, ticker, repdte}. UNITS: `asset` and `dep` are THOUSANDS of dollars. The store is loaded ACTIVE-ONLY, so a bank that merged away or failed is absent by construction -- an empty search is a fact about the loaded store, never about the world. `limit` default 25, hard cap 100. Source: FDIC.gov (public domain); FREE (no paywall on the hosted channel). ATTRIBUTION: every field is FDIC BankFind verbatim EXCEPT `ticker`, which is an Oxford Ledge-verified CERT-to-ticker mapping, not an FDIC-published field. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
limitinteger–Max institutions (default 25, hard cap 100).
querystring–Institution name prefix (omit for the top-by-assets list).

No output schema declared.

No examples provided.

ol_federal_contracts ~258

[Tier: free] Federal-contract obligation history for a ticker, OR the fiscal-year leaderboard -- for government-revenue-dependence diligence. TWO SHAPES: one of `ticker` or `fiscal_year` is REQUIRED (if both, `ticker` wins). With `ticker`: per-fiscal-year obligations (USD, the ten largest recipients, dropped_unresolved), NEWEST FY FIRST; with fiscal_year only: a leaderboard, largest first. A fiscal year still in progress is PARTIAL (period_complete false) and year-to-date -- never compare it to a full year. Obligations are federal awards, not company-reported revenue. `limit` default 20, hard cap 100. Source: USAspending.gov (public domain; OL ticker-crosswalked); FREE (no paywall on the hosted channel). Attributing awards to a ticker is an Oxford Ledge curated crosswalk. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
fiscal_yearinteger–Fiscal year for the top-contractors leaderboard.
limitinteger–Max rows (default 20, hard cap 100).
tickerstring–Stock ticker (omit for the FY leaderboard).

No output schema declared.

No examples provided.

ol_form_d_raises ~337

[Tier: free] Recent SEC Form D private-placement filings from the SEC's QUARTERLY Form D data set -- newest first, optionally scoped to an industry group and/or a trailing filing-date window. Returns {summary, count, days, industry, offerings}. Amounts are whole USD as disclosed; total_offering_amount is a ceiling, not money raised. The data set lands about one quarter after quarter-end, so a short `days` window is EMPTY BY CONSTRUCTION -- not evidence that nothing was filed. `limit` default 50, hard cap 200. Source: SEC EDGAR Form D data sets (public domain); FREE (no paywall on the hosted channel). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
daysinteger–Trailing filing-date window in days (optional; 1..1825; omit it for the 365-day default -- a value below 1 is refused as INVALID_PARAMS before any request, never widened to the default). The data set…
industrystring–Industry group filter (optional).
limitinteger–Max offerings (default 50, hard cap 200).

No output schema declared.

No examples provided.

ol_insider_recent_buys ~347

[Tier: free] Recent OPEN-MARKET insider PURCHASES (SEC code 'P') across the Oxford Ledge issuer catalog (~5.3k tickers) -- a daily insider screen. Returns {summary, since_days, count, buys}, NEWEST FIRST; each buy carries ticker, filing and transaction dates, insiderName, position, shares, pricePerShare, totalValue (USD), url. since_days default 30 (hard cap 180), limit default 25 (hard cap 100). SAMPLING TRAP: when the window holds more purchases than `limit`, you get the NEWEST N filings, not the whole window -- never total these rows and call it the period's insider buying. totalValue and the fallback `position` label are Oxford Ledge derivations (basis hybrid). Source: SEC EDGAR Form 4 (public domain); FREE (no paywall on the hosted channel). Pairs with get_insider_trades (one ticker). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
common_onlyboolean–Common stock only (default true): drops derivative rows and any security title naming preferred / pfd / warrant / debenture / note; Series-named common classes are kept. false restores every open-mar…
limitinteger–Max purchases (default 25, hard cap 100).
min_valuenumber–Only purchases with totalValue >= this many USD (optional); rows with no plausible filed price are dropped when this is set.
since_daysinteger–Trailing window in days (default 30, hard cap 180).

No output schema declared.

No examples provided.

ol_patents ~229

[Tier: free] Recent USPTO patent filings for a ticker (innovation-intensity diligence). Returns {summary, ticker, count, filings}, NEWEST FIRST; `limit` default 50, hard cap 200, so this is a recent slice, never a full portfolio, and `count` is the number RETURNED. TRAP: a non-empty patent_number marks a continuation of an already-granted PARENT, NOT a grant of this application -- read the status field. Filings reflect Oxford Ledge's last on-demand USPTO ingest for the ticker, not a schedule. Source: USPTO (public domain); FREE (no paywall on the hosted channel). ATTRIBUTION: every filing field is USPTO ODP verbatim EXCEPT `ticker`, which is an Oxford Ledge applicant-name resolution, not a USPTO field. Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
limitinteger–Max filings (default 50, hard cap 200).
tickerstringyesStock ticker (e.g. GOOGL).

No output schema declared.

No examples provided.

ol_treasury_debt ~234

[Tier: free] US Treasury debt composition from the Monthly Statement of the Public Debt. Omit BOTH args for the newest month's full class breakdown; pass security_type AND security_class together for that one class's monthly history (passing only one of them is IGNORED). Returns {summary, rows}. AMOUNTS ARE IN MILLIONS OF USD -- a 28,000,000 value means $28 trillion. The breakdown holds component AND Total rows, so summing a column double-counts. `limit` (series only) default 120 months, hard cap 360. Sibling of get_yield_curve. Source: Treasury.gov MSPD (public domain); FREE (no paywall on the hosted channel). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
limitinteger–Monthly points for a series (default 120, hard cap 360).
security_classstring–Class within the type; '_' for Total rows.
security_typestring–e.g. 'Total Public Debt Outstanding' (with security_class for a series).

No output schema declared.

No examples provided.

search_bdc_borrower ~343

[Tier: free] Which BDCs lend to one private-credit borrower, matched fuzzily on name -- Oxford Ledge's parse of SEC EDGAR BDC schedules of investments (ol-derived), not filer-published data. Returns borrowerName, borrowerNorm (the key get_bdc_borrower_mark_history and the ol_bdc_* tools take), description, descriptionSource, industry, aggregates over CURRENT holders (totalHolders, totalParAmount, totalFairValue, avgMarkedPrice) and `holders`, one row per TRANCHE. ABOVE-PAR TRAP: a mark above 100 is a par-basis artifact until fairValue is checked against cost, NOT a credit premium. `description` is a company profile, NOT filing text; a profile whose writer is not established is served with `_meta.ai_generated: true`. A miss is {found: false} -- a search miss, not a finding of no BDC exposure. `limit` / `offset` page `holders` only. Source: SEC EDGAR BDC schedules of investments (~45-60 day lag). Caveats ride the response's tool_notes. [Requires API mode]

NameTypeReqDescription
limitinteger–Max `holders` rows to return (default 5000 = every row; hard cap 5000, refused above). Pages the tranche rows only.
offsetinteger–Rows to skip before the page (default 0; max 5000). Past the end returns an empty page with `page.total` intact.
querystringyesBorrower/company name to search (e.g. Finastra, Medline)

No output schema declared.

No examples provided.

Common questions

What is the Oxford Ledge MCP server?

Oxford Ledge is an MCP server listed in the public MCP registry as com.oxfordledge/oxford-ledge. Ask your assistant; it reads the public record: SEC filings, 13F, insider trades, BDC loans. This page covers its PyPI package (oxford-ledge-mcp).

Is the Oxford Ledge MCP server safe to use?

Oxford Ledge scores 61 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 30 September 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Oxford Ledge MCP server expose?

Oxford Ledge exposes 29 tools: get_holders, get_sec_filings, get_insider_trades, get_fundamentals, get_yield_curve, and 24 more. Their descriptions and schemas cost roughly 8,163 tokens of context every time the server is loaded.

Is the Oxford Ledge MCP server still maintained?

Oxford Ledge is still listed as active in the MCP registry. We last reached this channel on 30 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Oxford Ledge MCP server under?

Oxford Ledge declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.