RosettaBLOCK
MCP Server with RouterOS docs + commands + products + changelogs, using SQLite-as-RAG, sourced from MikroTik
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
MCP server that gives AI assistants searchable access to MikroTik RouterOS documentation — 363 pages extracted live from MikroTik's official Docusaurus manual (), 4,587 properties, a 40,000-entry command tree, hardware specs for 156 current products (part of a wider 255-device overlay also covering legacy/EOL gear and accessories), 746 YouTube video transcripts, and direct links to source docs.
If you need MikroTik docs, you likely have a MikroTik. Install rosetta once as a container on your router using RouterOS /app, and any AI assistant on the network can use it. Or run it locally on your workstation. No AI required — rosetta includes a terminal browser for searching the database directly.
SQL-as-RAG
Instead of vector embeddings, rosetta uses SQLite [FTS5](https://www.sqlite.org/fts5.html) full-text search as the retrieval layer — SQL-as-RAG. For structured technical docs, BM25 ranking with porter stemming beats vector similarity: terms like dhcp-snooping and /ip/firewall/filter are exact tokens, not fuzzy embeddings. No API keys, no vector database — just a single SQLite file that searches in milliseconds.
What's Inside
3a70d563191cOBSERVED · 2026-10-08Connect
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 mcp add rosetta -- npx -y @tikoci/[email protected]
Exposed tools (16)
16 read · 0 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
color | read | Display color of the note. |
pvid | read | Port VLAN ID. |
routeros_command_diff | read | |
routeros_command_tree | read | |
routeros_command_version_check | read | |
routeros_current_versions | read | |
routeros_device_lookup | read | |
routeros_dude_get_page | read | |
routeros_dude_search | read | |
routeros_explain_command | read | |
routeros_get_page | read | |
routeros_lookup_property | read | |
routeros_search | read | |
routeros_search_changelogs | read | |
routeros_search_tests | read | |
routeros_stats | read |
Trust audit
BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (5 observation(s))
- Network
- declared (4 observation(s))
- Shell
- declared (3 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (25)
- **`/llms.txt`** — an index of all ~558 pages as `[Title](....md): description`
.claude/skills/pick-next-task
.claude/skills/pr-review-gate
.claude/skills/promote-idea
.claude/skills/re-extract
.claude/skills/verify-task
console.log(`\n0.10.0 (Confluence) vs current (Docusaurus) — topic-token hit@5\n`);
const raw = readFileSync(csvPath, "utf-8").replace(/^/, "");
const text = el.textContent?.replace(//g, "").trim() || "";
if (ch === ' ' || ch === '\t' || ch === '\r' || ch === '`' || ch === '') { i++; continue; }.coderabbit.yaml
.markdownlint-cli2.yaml
.markdownlint.yaml
.markdownlintignore
expect(src).not.toContain("MCP retrieval eval (Phase 0)");expect(src).not.toContain("MCP retrieval eval (Phase 1, self-supervised, non-blocking)");readFileSync(join(import.meta.dir, "../../fixtures/eval/queries.json"), "utf-8"),
const FIXTURE_PATH = join(import.meta.dir, "../../fixtures/eval/queries.json");
const BASELINE_PATH = join(import.meta.dir, "../../fixtures/eval/baseline.json");
"../../fixtures/eval/self-supervised-baseline.json",
<p>After the server is enabled, you can access the router, by entering <b><a rel="nofollow" class="external free" href="https://web.archive.org/web/20240615045957/http://127.0.0.1:8080/">http://127.0.
const resp = await fetch(`http://127.0.0.1:${port}/mcp`, {return { port, url: `http://127.0.0.1:${port}/mcp`, proc };const result = canonicalize('/ip/address/print');const result = canonicalize('/ip/address/print');Gates applied: no_behavioural_pass.
3a70d563191cfull audit observations/trust-audit/mcp-server/tikoci__rosetta-3.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | 3a70d563191c | BLOCK | D | 69 | first audit |
Questions
What is the Rosetta MCP server?
MCP Server with RouterOS docs + commands + products + changelogs, using SQLite-as-RAG, sourced from MikroTik
What tools does Rosetta expose?
16 in total: 16 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is Rosetta safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (69/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 Rosetta need?
It reads GH_TOKEN, GITHUB_TOKEN and TLS_KEY_PATH 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 Rosetta run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @tikoci/rosetta at 0.12.0-next.
How current is this page?
The grade is for one exact copy of the source (3a70d563191c), read on 2026-10-08. The repository is watched and re-audited when it changes.