Atlas / MCP servers / cammac-creator / openswissdata

openswissdataBLOCK

mcp/cammac-creator/openswissdata

Swiss federal reference data for AI agents: customs tariff (TARES), FINMA register and warnings list, NOGA/NACE/ISIC crosswalks. Free MCP server, no key. Signed dataset files.

Verdict
BLOCK
Grade
F
Trust score
60 /100
Exposed tools
4 4r · 0w · 0d
Transport
stdio · streamable-http
License
—
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Swiss federal reference data for AI agents and developers: the Swiss customs tariff (TARES, 8-digit tariff numbers with MFN duty and preferential regimes), the FINMA register of supervised institutions and the FINMA warnings list, and NOGA / NACE / ISIC activity-code correspondences.

  • Free MCP endpoint, no key or sign-up: https://mcp.openswissdata.com/jsonrpc, four tools (tariff_lookup, kyc_check, company_check, cross_walk), 100 calls per hour per IP address, plus a free trial of the three search tools (tariff_semantic_search, classify_text, finma_search): 20 calls per day per IP address in total. Claude Code: claude mcp add --transport http openswissdata https://mcp.openswissdata.com/jsonrpc. Local-process clients: npx -y @openswissdata/mcp.
  • Full datasets as signed files: openswissdata.com. Summary for AI agents: llms.txt.
  • Read-only REST API, no key: /api/v1/company/:uid, /api/v1/localities, /api/v1/communes/:bfs_id and /api/v1/sources, limited per network address; see the REST API section of llms.txt and openapi.json.
  • Unofficial copies: binding decisions belong to the official sources (xtares.admin.ch, finma.ch, the Swiss Federal Statistical Office).

Tools

Read from source at commit 7b59339b385bOBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add mcp --env OPENSWISSDATA_API_KEY=${OPENSWISSDATA_API_KEY} -- npx -y @openswissdata/[email protected]
03

Exposed tools (4)

4 read · 0 write · 0 destructive.

ToolRiskDescription
NomreadDescription
entity_historyreadReturns the timeline of changes for a FINMA-supervised entity (registration, authorisation type changes, status mutations, address moves, warning-list flag transitions). Keyed by Swiss UID (CHE-xxx.xxx.xxx). Irreplicable by scraping — finma.ch only publishes the current state.
tariff_changelogreadReturns the historical changelog of MFN duty rates (and adjacent fields) for a Swiss customs tariff (HS8) code, across every dated release we have archived (history deepens over time from launch). Irreplicable by scraping — xtares.admin.ch only serves the current version. Requires
tariff_lookupreadLookup HS8
04

Trust audit

BLOCKgrade F · trust 60/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (4 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
.claude/hooks/garde-financier.mjs:30
const SECRETS = ['.env', '.env.*', '.mcpregistry_*', '**/veille-telegram/creds.env', '**/.ibf-*', '**/.ssh/id_*',
Why it matters. touches a credential store
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/lib/visitor-identity.ts:13
const key = secret && secret.length >= 16 ? secret : 'osd-local-visitors-development-only';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/lib/visitor-identity.test.ts:18
const secret = 'cle-fictive-visiteurs-uniquement';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/mcp/auth-boundaries.test.ts:15
const SECRET='secret-fictif-frontieres',ACCESS='A'.repeat(43),REFRESH='R'.repeat(43),ADMIN='M'.repeat(43);
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/mcp/company-zefix-rest.test.ts:44
const PASSWORD = "mot-de-passe-fictif-osd";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/mcp/token-scope-flow.test.ts:12
const CLIENT='osd_cycle_fictif',SECRET='secret-fictif-cycle-oauth',ACCESS='A'.repeat(43),REFRESH='R'.repeat(43);
LOWInventory / provenance · inv.binary · CWE-1104
etl/classifications/fixtures/noga-2008-sample.xlsx
noga-2008-sample.xlsx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
etl/classifications/fixtures/noga-2025-sample.xlsx
noga-2025-sample.xlsx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
etl/finma/fixtures/finma-ao-sample.xlsx
finma-ao-sample.xlsx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
etl/finma/fixtures/finma-asset-manager-individual-sample.xlsx
finma-asset-manager-individual-sample.xlsx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
etl/finma/fixtures/finma-banks-sample.xlsx
finma-banks-sample.xlsx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitignore.local
.gitignore.local
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.railwayignore
.railwayignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
etl/classifications/bundle.ts:11
import type { ClassificationLink, ClassificationSource } from "../../src/lib/classification-links.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
etl/classifications/classify.ts:1
import { createEmbeddingExtractor } from "../../src/lib/embedding-model.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
etl/classifications/embeddings.ts:1
import { createEmbeddingExtractor, EMBEDDING_REVISION } from "../../src/lib/embedding-model.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
etl/classifications/fixtures/generate-fixture.ts:1
import { utils, writeFile } from "../../shared/xlsx.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
etl/classifications/ingest-real.ts:6
import type { ClassificationLink } from "../../src/lib/classification-links.js";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/mcp/authorization-validation.test.ts:63
it.each(['http://localhost:8765/callback','http://127.0.0.1:8765/callback'])('autorise une boucle locale enregistrée exactement : %s',async uri=>{
LOWObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
tests/lib/letters.test.ts:98
expect(isAllowedRecipient("x@аdmin.ch")).toBe(false); // а U+0430, pas 'a' U+0061
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/etl/canary-shape.test.ts:69
"" +
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/etl/canary-shape.test.ts:83
const withBom = hashCsvShape(Buffer.from("a;b;c\r\n1;2;3", "utf-8"));
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/scripts/prospect-sources.test.ts:301
return splitHeaderColumns(raw.replace(/^/, "").trim());
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/scripts/sync-bfe-pv.test.ts:43
const bom = opts.bom === false ? "" : "";
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/scripts/sync-localities.test.ts:48
const BOM = "";

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 7b59339b385bfull audit observations/trust-audit/mcp-server/cammac-creator__openswissdata.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-117b59339b385bBLOCKF60first audit
06

Questions

What is the openswissdata MCP server?

Swiss federal reference data for AI agents: customs tariff (TARES), FINMA register and warnings list, NOGA/NACE/ISIC crosswalks. Free MCP server, no key. Signed dataset files.

What tools does openswissdata expose?

4 in total: 4 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is openswissdata safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (60/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What credentials does openswissdata need?

It reads ADMIN_SECRET, MCP_BEARER_TOKEN, OAUTH_SIGNING_SECRET, OPENSWISSDATA_API_KEY, OSD_BACKUP_KEY, OSD_SIGNING_KEY_ED25519, OSD_VEILLE_TELEGRAM_TOKEN, PLAUSIBLE_API_KEY, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, RESEND_API_KEY and SESSION_SECRET from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does openswissdata run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as web at 0.0.1.

How current is this page?

The grade is for one exact copy of the source (7b59339b385b), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement