ukvet: UK Companies House
Read-only UK Companies House tools for due diligence: profile, officers, PSC, charges, insolvency.
What can you do with ukvet: UK Companies House?
- Is it active, dissolved or insolvent?
- How old is it?
- Who are the directors?
- Are its accounts or confirmation statement overdue?
- Who controls it?
- Does it have secured debts (charges)?
- Any insolvency history?
- Have its directors run companies that failed?
Install
Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).
ukvet-mcpclaude mcp add ukvet-uk-companies-house -e 'CH_API_KEY=<your ch_api_key>' -- uvx ukvet-mcp==0.1.0
{
"mcpServers": {
"ukvet-uk-companies-house": {
"command": "uvx",
"args": [
"ukvet-mcp==0.1.0"
],
"env": {
"CH_API_KEY": "<your ch_api_key>"
}
}
}
}
Environment variables
CH_API_KEYrequired secret Your free Companies House REST API key (live environment)
Documentation
From the project's README on GitHub, refreshed weekly. Links open on GitHub.
Contents
ukvet — AI Due-Diligence Agent for UK Companies
Vet any UK company in 30 seconds — cited, evaluated, open source.
Status: Phase 5 (model comparison) complete.
ukvet-mcp(8 tools) andukvet-agent(LangGraph agent, FastAPI, Streamlit UI, Docker) are built and tested. A versioned evaluation set (48 companies, 432 items) is replayed through the real stack and gated in CI (docs/eval-report.md). Phase 4 added optional Langfuse tracing, per-report cost and tool-call counts, output guardrails, and a prompt-injection evaluation (M6) (threat model). Phase 5 compared Claude Haiku 5.5 with the open-weight Qwen3.6-27B on the same test set: equal measured accuracy, but Claude was about 3.7 times faster at the p95 and about 13 times cheaper per report (docs/results.md). Next: Phase 6 (launch).
What it does
Enter a UK company name or number. ukvet checks official Companies House records and returns a risk report answering:
- Is it active, dissolved or insolvent?
- How old is it?
- Who are the directors?
- Are its accounts or confirmation statement overdue?
- Who controls it?
- Does it have secured debts (charges)?
- Any insolvency history?
- Have its directors run companies that failed?
- Any recent changes of directors or address?
- What are the red flags?
Every fact is cited to the official record. When data is missing, ukvet says so instead of guessing.
How it's built
| Part | What |
|---|---|
ukvet-mcp | Open-source MCP server exposing Companies House data to any MCP client |
ukvet-agent | LangGraph agent: Planner → Researcher → Verifier → Reporter |
| Evals | 432-item benchmark on 48 frozen, anonymised companies; gated in CI (evals/) |
| Observability | Optional Langfuse tracing (off by default, content redacted); per-report latency, tokens, cost and tool calls |
| Guardrails | Citation checker plus output checks on every finished report; injection eval (M6) |
| Model choice | Claude Haiku 5.5 vs open-weight Qwen3.6-27B on one test set, published as a table (results) |
Architecture: docs/08-architecture.md
Development
Requires Python 3.12+ and uv. Commands below are shown for PowerShell; on Linux or macOS the same uv run ... commands work (a Makefile is provided as a shortcut where make is available).
git clone https://github.com/fraidoonomarzai/ukvet.git
cd ukvet
copy .env.example .env # add your Companies House API key
uv sync --all-groups --all-packages # install dependencies
uv run ruff check . # lint
uv run ruff format --check . # formatting
uv run mypy # type check
uv run pytest # tests
Run it
# .env: CH_API_KEY=... (optional: LLM_PROVIDER / LLM_MODEL / LLM_API_KEY, see .env.example)
uv run ukvet-check --full 00445790 # terminal, no UI
docker compose up --build # API (http://localhost:8000/docs) + UI (http://localhost:8501)
With no LLM_PROVIDER set, reports use a template narrative and cost nothing. With one set, the LLM writes the wording and every sentence must pass the citation check, or the template is used instead.
Run the evaluation
uv run ukvet-evals demo-build # synthetic demo set, proves the harness works
uv run ukvet-evals run --dataset demo
uv run ukvet-evals run --dataset v0.1 --split dev # real set, dev split, free (template mode)
uv run ukvet-evals gate --dataset v0.1 # compare with the baseline; fails if worse
Observability and safety (Phase 4)
# .env (all optional): LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_HOST
# UKVET_TRACE_CONTENT=redacted (default, names are masked) or full (synthetic data only)
# UKVET_PRICE_IN_GBP_PER_MTOK / UKVET_PRICE_OUT_GBP_PER_MTOK (cost is shown only when set)
uv sync --all-groups --all-packages --extra observability
# live latency (M7), cost (M8) and tool calls (M9); needs CH_API_KEY and an LLM key
uv run python scripts/phase4_metrics.py --file numbers.txt --out evals/results/phase4
# prompt-injection resistance (M6): record once, then replay for free
uv run ukvet-evals extend-injection --dataset v0.1
uv run ukvet-evals injection --dataset v0.1 --llm record --model <model>
uv run ukvet-evals injection --dataset v0.1 --llm replay --model <model>
Tracing is off unless both Langfuse keys are set, and it can never break a report. Targets: M6 injection resistance 95% or more, M7 p95 latency under 30 s, M8 cost under £0.05 per report, M9 tool calls per report tracked as a baseline. M6 measures resistance to the listed payloads only; it is not proof of safety. Measured results are in evals/results/.
Model comparison (Phase 5)
# one env file per model; copy the one you want over .env
uv run python scripts/phase5_check_endpoint.py # smoke-test an OpenAI-compatible endpoint (vLLM)
uv run ukvet-evals run --dataset v0.1 --split test --llm record --model <model-id> --confirm-test-split "reason" --out evals/results/v0.1-test-<name>
uv run python scripts/phase4_metrics.py --file numbers.txt --label <name> --out evals/results/phase5-live-<name>
uv run ukvet-evals compare --init # create evals/comparison.json, fill it in
uv run ukvet-evals compare # writes docs/results.md; refuses unfair comparisons
Both models must run on the same dataset version, split, prompts and git commit; compare refuses different datasets or splits and warns about the rest. How the open-weight model was served: ADR-008 and docs/PHASE-5-GPU-SETUP.md.
Project documents
| Doc | Contents |
|---|---|
| 01 Problem statement | Why ukvet exists |
| 02 Users and questions | Personas and Q1–Q10 |
| 03 Scope | In, out, later |
| 04 Success metrics | Targets fixed before building |
| 05 Data notes | API findings |
| 06 Legal and ethics | Licensing, UK GDPR, misuse |
| 07 Risks | Risk register |
| 08 Architecture | Design + ADRs |
| 09 Plan | Milestones, backlog, workflow |
...
Disclaimer
ukvet is informational only. It is not legal, financial or credit advice. Reports are based on public records at the time of retrieval, which may be incomplete or out of date. Always verify before making decisions. ukvet is not affiliated with Companies House.
Attribution
Contains public sector information licensed under the Open Government Licence v3.0 (Companies House).
Licence
Code: MIT © 2026 Fraidoon Omarzai
Frequently asked questions
What is ukvet: UK Companies House?
Read-only UK Companies House tools for due diligence: profile, officers, PSC, charges, insolvency.
How do I install ukvet: UK Companies House?
It runs on your machine. In Claude Code: claude mcp add ukvet-uk-companies-house -e 'CH_API_KEY=<your ch_api_key>' -- uvx ukvet-mcp==0.1.0. For other clients, paste the JSON configuration from this page into their MCP settings.
Does ukvet: UK Companies House need an API key?
Yes. It expects CH_API_KEY, which you set in its configuration.
Is ukvet: UK Companies House open source?
Yes. Its code is on GitHub under the MIT license.
Who maintains ukvet: UK Companies House?
It is published by fraidoonomarzai. AI.tn lists it but does not maintain or endorse it.
From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.