ssid-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -0
- package/index.js +57 -0
- package/package.json +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# ssid-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for [SSID](https://ssid.ai) — identify the manufacturer behind any MAC
|
|
4
|
+
address, and detect randomized/private addresses used by modern phones.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
Add to any MCP-capable host (Claude Desktop, Cursor, etc.):
|
|
9
|
+
|
|
10
|
+
```json
|
|
11
|
+
{
|
|
12
|
+
"mcpServers": {
|
|
13
|
+
"ssid": { "command": "npx", "args": ["-y", "ssid-mcp"] }
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Tool
|
|
19
|
+
|
|
20
|
+
- **`lookup_mac(mac)`** → vendor, OUI, `kind` (universal / randomized / multicast /
|
|
21
|
+
invalid), `randomized` flag, confidence and the source.
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
lookup_mac("F4:F5:E8:11:22:33")
|
|
25
|
+
→ { "vendor": { "organization": "Google, Inc." }, "kind": "universal", "randomized": false, ... }
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Auth
|
|
29
|
+
|
|
30
|
+
The free tier needs no key. To raise limits, set `SSID_API_KEY` (get one at
|
|
31
|
+
https://ssid.ai/api-docs). Point at a different base with `SSID_API_BASE`.
|
|
32
|
+
|
|
33
|
+
Data compiled from the IEEE OUI registry. Facts are public; SSID adds freshness,
|
|
34
|
+
randomized-MAC detection and a stable, SLA-backed feed.
|
package/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* ssid-mcp — standalone, publishable MCP server for agent hosts.
|
|
4
|
+
*
|
|
5
|
+
* Unlike the in-repo mcp/server.ts (which reads the local DB), this package calls
|
|
6
|
+
* the HOSTED public API (https://ssid.ai/api/v1/lookup) so `npx -y ssid-mcp` works
|
|
7
|
+
* with zero local data. One tool: lookup_mac. No API key needed for the free tier;
|
|
8
|
+
* set SSID_API_KEY to raise limits.
|
|
9
|
+
*
|
|
10
|
+
* NOT YET PUBLISHED — publishing to npm + the MCP registries (growth G1) is gated on
|
|
11
|
+
* the G19 paid-agent validation and the 6201 license. This is publish-ready.
|
|
12
|
+
*/
|
|
13
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
14
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
|
|
17
|
+
const BASE = process.env.SSID_API_BASE || "https://ssid.ai";
|
|
18
|
+
const API_KEY = process.env.SSID_API_KEY || "";
|
|
19
|
+
|
|
20
|
+
async function lookup(mac) {
|
|
21
|
+
const url = `${BASE}/api/v1/lookup?mac=${encodeURIComponent(mac)}`;
|
|
22
|
+
const headers = API_KEY ? { Authorization: `Bearer ${API_KEY}` } : {};
|
|
23
|
+
const res = await fetch(url, { headers });
|
|
24
|
+
if (!res.ok) throw new Error(`SSID API error ${res.status}`);
|
|
25
|
+
return res.json();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function main() {
|
|
29
|
+
const server = new McpServer({ name: "ssid", version: "0.1.0" });
|
|
30
|
+
|
|
31
|
+
server.registerTool(
|
|
32
|
+
"lookup_mac",
|
|
33
|
+
{
|
|
34
|
+
title: "MAC / OUI vendor lookup",
|
|
35
|
+
description:
|
|
36
|
+
"Identify the manufacturer (vendor) behind a MAC address from its OUI, and detect randomized/private (locally-administered) addresses used by modern phones. Returns vendor, OUI, kind, randomized flag, confidence and the source.",
|
|
37
|
+
inputSchema: { mac: z.string().describe("A MAC address in any format, e.g. F4:F5:E8:11:22:33") },
|
|
38
|
+
},
|
|
39
|
+
async ({ mac }) => {
|
|
40
|
+
try {
|
|
41
|
+
const data = await lookup(mac);
|
|
42
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
43
|
+
} catch (e) {
|
|
44
|
+
return { content: [{ type: "text", text: `Lookup failed: ${e.message}` }], isError: true };
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const transport = new StdioServerTransport();
|
|
50
|
+
await server.connect(transport);
|
|
51
|
+
console.error("[ssid-mcp] ready on stdio");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
main().catch((e) => {
|
|
55
|
+
console.error(e);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ssid-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "SSID MCP server — identify the manufacturer behind any MAC address, with randomized-address detection. Backed by ssid.ai.",
|
|
5
|
+
"author": "SSID (Drumworks Ventures FZ)",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"publishConfig": { "access": "public" },
|
|
8
|
+
"type": "module",
|
|
9
|
+
"bin": {
|
|
10
|
+
"ssid-mcp": "index.js"
|
|
11
|
+
},
|
|
12
|
+
"files": ["index.js", "README.md"],
|
|
13
|
+
"keywords": ["mcp", "modelcontextprotocol", "mac-address", "oui", "network", "device-identity", "ssid"],
|
|
14
|
+
"homepage": "https://ssid.ai",
|
|
15
|
+
"repository": { "type": "git", "url": "https://github.com/Drumworks/ssid" },
|
|
16
|
+
"engines": { "node": ">=18" },
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
19
|
+
"zod": "^3.23.0"
|
|
20
|
+
}
|
|
21
|
+
}
|