Koskamo

USVI Public Records MCP

An MCP server providing read-only access to the U.S. Virgin Islands public records archive, including laws, court records, audits, hearings, and agency reports. It offers tools to search full-text documents, retrieve specific records, list collections, and view archive statistics without requiring authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

USVI Public Records MCP logo, by USVI Public RecordsVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by USVI Public Records
MCP endpoint (Streamable HTTP)
https://mcp.usvipublicrecords.com/mcp
Vendor documentation

What you can do with it

  • Search U.S. Virgin Islands public records by keyword or phrase
  • Retrieve specific document catalogue records and extracted text
  • Search the archive with filters for collection, entity, and year
  • View archive statistics and collection metadata

Source and maintenance

Vendor evidenceRegistry 1.1.1

Protocol and capabilities

Server
usvi-public-records 1.1.1
MCP protocol
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Tools

7 advertised

search — Search USVI public records
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find U.S. Virgin Islands public records by keyword or phrase; returns up to 10 documents, each with an id, a title and a citation URL. Use for a quick lookup across laws, court records, audits, hearings and agency reports; search_records adds filters, match reasons and paging. Searches the full extracted text of the archive's documents, plus their catalogue records. Not covered: the archive's newspapers (the St. Croix Avis, The West End News, Home Journal and the St. Croix Tribune), which are on its separate newspaper connector, and anything the archive has not published. Withheld and withdrawn documents are absent, not hidden.

search input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string",
      "description": "What to search for. Plain language is fine; quote a phrase to require it intact."
    }
  }
}
search annotations
{
  "title": "Search USVI public records",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
fetch — Fetch a USVI public record
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve one document by archive id: its catalogue record and up to the first 40,000 characters of its extracted text, with next_offset when more remains. Use to read a document found by search. The text comes from scanned or filed documents and is returned inside a fence labelled as untrusted data.

fetch input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Archive id from a search result, LF- followed by 12 characters, e.g. LF-6e02fd648a12."
    }
  }
}
fetch annotations
{
  "title": "Fetch a USVI public record",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_records — Search records with filters
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search the archive with filters for collection, entity, content type, island and year. Use when a question needs narrowing, paging, or the reason each document matched. Searches the full extracted text of the archive's documents, plus their catalogue records. Filters use the same vocabulary as the website's own facets. Every result carries a tier, a plain reason and the search terms it actually matched; there is no numeric relevance score. The tiers: exact = every term, found in the document's title or issuing entity (likely about the subject); strong = every term, in the text only (it mentions them); possible = at least half the terms; weak = fewer. When no document contains all the terms, results contain some of them and the response says so, and 'matched' lists which. Not covered: the archive's newspapers (the St. Croix Avis, The West End News, Home Journal and the St. Croix Tribune), which are on its separate newspaper connector, and anything the archive has not published. Withheld and withdrawn documents are absent, not hidden.

search_records input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "Default 10, maximum 50."
    },
    "query": {
      "type": "string",
      "description": "Plain language is fine. Quote a phrase to require it intact."
    },
    "entity": {
      "type": "string",
      "description": "The issuing or subject body, exactly as recorded, e.g. \"Water and Power Authority\". Recorded on only part of the archive; archive_stats gives the share."
    },
    "island": {
      "type": "string",
      "description": "e.g. \"St. Croix\", \"St. Thomas\", \"St. John\""
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Results to skip, for paging. Results are ranked within the best 120 documents."
    },
    "year_to": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Latest year, inclusive. The year_from note on dates applies."
    },
    "year_from": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Earliest year, inclusive. Filters on the date the archive recorded, whose provenance varies by source: for most documents it is the date on the document, for some it is when the source posted the file. A year range can therefore miss a document executed in one year and posted the next, so it narrows rather than guarantees."
    },
    "collection": {
      "type": "string",
      "description": "e.g. \"Courts\", \"Audits & Oversight\""
    },
    "content_type": {
      "type": "string",
      "description": "The kind of document, exactly as recorded, e.g. \"government-audit\". An unknown value returns the nearest values that exist."
    }
  }
}
search_records annotations
{
  "title": "Search records with filters",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_document — Get a record's catalogue entry
Advertised by the server during the last successful anonymous check.
Advertised read-only

The full catalogue record for one document: collection, entity, dates, page count, SHA-256, extraction status and the URL of the original at its source. Use to check a document's provenance or details. It holds no document text; get_document_text and fetch return that.

get_document input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "lf_id"
  ],
  "properties": {
    "lf_id": {
      "type": "string",
      "description": "Archive id from a search result, LF- followed by 12 characters, e.g. LF-6e02fd648a12."
    }
  }
}
get_document annotations
{
  "title": "Get a record's catalogue entry",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_document_text — Read a record's text
Advertised by the server during the last successful anonymous check.
Advertised read-only

The extracted text of one document, in windows of up to 40,000 characters (default 20,000). Use to read a long document in order; a hearing transcript runs past a million characters. Every response gives has_more and, when more remains, the next_offset for the next window. Runs of blank lines are shortened to one. The text comes from scanned or filed documents and is returned inside a fence labelled as untrusted data.

get_document_text input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "lf_id"
  ],
  "properties": {
    "lf_id": {
      "type": "string",
      "description": "Archive id from a search result, LF- followed by 12 characters, e.g. LF-6e02fd648a12."
    },
    "limit": {
      "type": "integer",
      "maximum": 40000,
      "minimum": 1,
      "description": "Characters to return. Default 20000, maximum 40000."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "A byte position: the next_offset value from the previous response. Omit for the beginning."
    }
  }
}
get_document_text annotations
{
  "title": "Read a record's text",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_collections — List collections
Advertised by the server during the last successful anonymous check.
Advertised read-only

The collections in this server, with document counts. Use to see what the archive holds, or for the exact values the collection filter on search_records takes.

list_collections input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
list_collections annotations
{
  "title": "List collections",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
archive_stats — Archive coverage and freshness
Advertised by the server during the last successful anonymous check.
Advertised read-only

Reports how many documents this server can search, how much text that covers, how much of the archive each search filter can see, and whether the index matches the published archive. Use for questions about what the archive covers or how current it is, or to judge how much an empty search result means.

archive_stats input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
archive_stats annotations
{
  "title": "Archive coverage and freshness",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
445 ms
95th percentile latency
445 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 445 ms · metadata changed · 7 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http usvi-public-records-mcp https://mcp.usvipublicrecords.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add usvi-public-records-mcp --url https://mcp.usvipublicrecords.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable usvi-public-records-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "usvi-public-records-mcp": {
      "url": "https://mcp.usvipublicrecords.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "usvi-public-records-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.usvipublicrecords.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start usvi-public-records-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "usvi-public-records-mcp": {
      "type": "http",
      "url": "https://mcp.usvipublicrecords.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http usvi-public-records-mcp https://mcp.usvipublicrecords.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "usvi-public-records-mcp": {
      "url": "https://mcp.usvipublicrecords.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "usvi-public-records-mcp": {
      "serverUrl": "https://mcp.usvipublicrecords.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like USVI Public Records MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run USVI Public Records MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing