@urbankitstudio/mcp-atlas 0.1.5 → 0.1.6

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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Leo Yong
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Leo Yong
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,158 +1,156 @@
1
- # @urbankitstudio/mcp-atlas
2
-
3
- [![mcp-atlas MCP server](https://glama.ai/mcp/servers/LEOyrh/mcp-atlas/badges/card.svg)](https://glama.ai/mcp/servers/LEOyrh/mcp-atlas)
4
-
5
- Query 155 verified US county parcel ArcGIS REST endpoints for owner, APN, and address lookup via the Model Context Protocol (MCP).
6
-
7
- An [MCP](https://modelcontextprotocol.io) server that gives AI assistants direct access to UrbanKit Studio's atlas of manually verified county parcel GIS services. Ask Claude or Cursor to find the ArcGIS REST endpoint for any covered county, get the exact owner-search query URL, and look up parcel data — without needing to know anything about ArcGIS REST API conventions.
8
-
9
- **Coverage:** 155 counties across all 50 US states.
10
-
11
- ---
12
-
13
- ## Quick start
14
-
15
- ### Claude Desktop
16
-
17
- Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
18
-
19
- ```json
20
- {
21
- "mcpServers": {
22
- "mcp-atlas": {
23
- "command": "npx",
24
- "args": ["-y", "@urbankitstudio/mcp-atlas"]
25
- }
26
- }
27
- }
28
- ```
29
-
30
- ### Cursor
31
-
32
- Add to `.cursor/mcp.json` in your project root (or `~/.cursor/mcp.json` globally):
33
-
34
- ```json
35
- {
36
- "mcpServers": {
37
- "mcp-atlas": {
38
- "command": "npx",
39
- "args": ["-y", "@urbankitstudio/mcp-atlas"]
40
- }
41
- }
42
- }
43
- ```
44
-
45
- ### Install globally (optional)
46
-
47
- ```sh
48
- npm install -g @urbankitstudio/mcp-atlas
49
- ```
50
-
51
- Then use `mcp-atlas` as the command instead of `npx -y @urbankitstudio/mcp-atlas`.
52
-
53
- ---
54
-
55
- ## Tools
56
-
57
- ### `list_counties`
58
-
59
- Lists all counties with a verified parcel REST endpoint.
60
-
61
- | Parameter | Type | Required | Description |
62
- |-----------|------|----------|-------------|
63
- | `state` | string | No | Two-letter abbreviation (`IL`) or full name (`Illinois`) |
64
-
65
- **Example prompt:** "List all covered counties in Illinois"
66
-
67
- **Example output:**
68
- ```
69
- ST | County | Slug | Coverage
70
- --------------------------------------------------------------------
71
- IL | Kane | kane-county | owner+APN
72
- IL | Cook | cook-county | APN only
73
- IL | DuPage | dupage-county | owner+APN
74
- ...
75
- ```
76
-
77
- ---
78
-
79
- ### `find_county`
80
-
81
- Fuzzy-matches a county by name or 5-digit FIPS code. Returns endpoint URLs, searchable field names, owner field, sample query, and license info.
82
-
83
- | Parameter | Type | Required | Description |
84
- |-----------|------|----------|-------------|
85
- | `query` | string | Yes | County name (`Kane`), name+state (`Kane IL`), or FIPS (`17089`) |
86
-
87
- **Example prompt:** "Find the parcel endpoint for Kane County Illinois"
88
-
89
- ---
90
-
91
- ### `get_parcel_endpoint`
92
-
93
- Returns the full ArcGIS REST URL, layer index, searchable fields, owner field, and a ready sample `?where=…&f=json` query for a specific county.
94
-
95
- | Parameter | Type | Required | Description |
96
- |-----------|------|----------|-------------|
97
- | `state` | string | Yes | Two-letter abbreviation or full name |
98
- | `county` | string | Yes | County name (`Kane` or `Kane County`) |
99
-
100
- **Example prompt:** "Give me the ArcGIS REST endpoint for Cook County Illinois"
101
-
102
- ---
103
-
104
- ### `build_owner_query`
105
-
106
- Constructs the exact ArcGIS REST query URL using the county's verified owner/taxpayer field. Uses `UPPER(field) LIKE UPPER('%NAME%')` — case-insensitive partial match.
107
-
108
- | Parameter | Type | Required | Description |
109
- |-----------|------|----------|-------------|
110
- | `state` | string | Yes | Two-letter abbreviation or full name |
111
- | `county` | string | Yes | County name |
112
- | `owner_name` | string | Yes | Owner/taxpayer name (partial match) |
113
-
114
- **Example prompt:** "Build an ArcGIS query for properties owned by 'Smith' in Kane County IL"
115
-
116
- **Example output:**
117
- ```
118
- County: Kane, Illinois
119
- Owner field: TaxName
120
- WHERE clause: UPPER(TaxName) LIKE UPPER('%SMITH%')
121
-
122
- Query URL:
123
- https://gistech.countyofkane.org/arcgis/rest/services/KanePINList/MapServer/0/query
124
- ?where=UPPER(TaxName)%20LIKE%20UPPER('%25SMITH%25')
125
- &outFields=PIN,TaxName,SiteAddress,SiteCity,MailingAddress
126
- &returnGeometry=false&f=json&resultRecordCount=25
127
- ```
128
-
129
- ---
130
-
131
- ## Example conversation
132
-
133
- > **User:** I'm doing due diligence on properties in Kane County, Illinois. Can you find all parcels owned by "Blackstone"?
134
-
135
- > **Claude (using mcp-atlas):**
136
- > 1. Calls `get_parcel_endpoint` → gets the `gistech.countyofkane.org` URL and confirms the owner field is `TaxName`
137
- > 2. Calls `build_owner_query` with `owner_name=Blackstone` → returns a ready fetch URL
138
- > 3. Optionally fetches the URL and formats the parcel results
139
-
140
- ---
141
-
142
- ## Atlas coverage
143
-
144
- The atlas is maintained by [UrbanKit Studio](https://urbankitstudio.com/parcel-atlas). All endpoints are manually verified. Counties with an owner/taxpayer field support full name-based lookups; PIN-only counties support APN/parcel-number queries.
145
-
146
- Full coverage map: https://urbankitstudio.com/parcel-atlas
147
-
148
- ---
149
-
150
- ## Data
151
-
152
- Atlas data is embedded in the package (no network calls at startup). The underlying `@urbankitstudio/atlas` SDK is also published separately for programmatic use.
153
-
154
- ---
155
-
156
- ## License
157
-
158
- MIT — © Leo Yong / UrbanKit Studio
1
+ # @urbankitstudio/mcp-atlas
2
+
3
+ Query 155 verified US county parcel ArcGIS REST endpoints for owner, APN, and address lookup via the Model Context Protocol (MCP).
4
+
5
+ An [MCP](https://modelcontextprotocol.io) server that gives AI assistants direct access to UrbanKit Studio's atlas of manually verified county parcel GIS services. Ask Claude or Cursor to find the ArcGIS REST endpoint for any covered county, get the exact owner-search query URL, and look up parcel data — without needing to know anything about ArcGIS REST API conventions.
6
+
7
+ **Coverage:** 155 counties across all 50 US states.
8
+
9
+ ---
10
+
11
+ ## Quick start
12
+
13
+ ### Claude Desktop
14
+
15
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
16
+
17
+ ```json
18
+ {
19
+ "mcpServers": {
20
+ "mcp-atlas": {
21
+ "command": "npx",
22
+ "args": ["-y", "@urbankitstudio/mcp-atlas"]
23
+ }
24
+ }
25
+ }
26
+ ```
27
+
28
+ ### Cursor
29
+
30
+ Add to `.cursor/mcp.json` in your project root (or `~/.cursor/mcp.json` globally):
31
+
32
+ ```json
33
+ {
34
+ "mcpServers": {
35
+ "mcp-atlas": {
36
+ "command": "npx",
37
+ "args": ["-y", "@urbankitstudio/mcp-atlas"]
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ ### Install globally (optional)
44
+
45
+ ```sh
46
+ npm install -g @urbankitstudio/mcp-atlas
47
+ ```
48
+
49
+ Then use `mcp-atlas` as the command instead of `npx -y @urbankitstudio/mcp-atlas`.
50
+
51
+ ---
52
+
53
+ ## Tools
54
+
55
+ ### `list_counties`
56
+
57
+ Lists all counties with a verified parcel REST endpoint.
58
+
59
+ | Parameter | Type | Required | Description |
60
+ |-----------|------|----------|-------------|
61
+ | `state` | string | No | Two-letter abbreviation (`IL`) or full name (`Illinois`) |
62
+
63
+ **Example prompt:** "List all covered counties in Illinois"
64
+
65
+ **Example output:**
66
+ ```
67
+ ST | County | Slug | Coverage
68
+ --------------------------------------------------------------------
69
+ IL | Kane | kane-county | owner+APN
70
+ IL | Cook | cook-county | APN only
71
+ IL | DuPage | dupage-county | owner+APN
72
+ ...
73
+ ```
74
+
75
+ ---
76
+
77
+ ### `find_county`
78
+
79
+ Fuzzy-matches a county by name or 5-digit FIPS code. Returns endpoint URLs, searchable field names, owner field, sample query, and license info.
80
+
81
+ | Parameter | Type | Required | Description |
82
+ |-----------|------|----------|-------------|
83
+ | `query` | string | Yes | County name (`Kane`), name+state (`Kane IL`), or FIPS (`17089`) |
84
+
85
+ **Example prompt:** "Find the parcel endpoint for Kane County Illinois"
86
+
87
+ ---
88
+
89
+ ### `get_parcel_endpoint`
90
+
91
+ Returns the full ArcGIS REST URL, layer index, searchable fields, owner field, and a ready sample `?where=…&f=json` query for a specific county.
92
+
93
+ | Parameter | Type | Required | Description |
94
+ |-----------|------|----------|-------------|
95
+ | `state` | string | Yes | Two-letter abbreviation or full name |
96
+ | `county` | string | Yes | County name (`Kane` or `Kane County`) |
97
+
98
+ **Example prompt:** "Give me the ArcGIS REST endpoint for Cook County Illinois"
99
+
100
+ ---
101
+
102
+ ### `build_owner_query`
103
+
104
+ Constructs the exact ArcGIS REST query URL using the county's verified owner/taxpayer field. Uses `UPPER(field) LIKE UPPER('%NAME%')` — case-insensitive partial match.
105
+
106
+ | Parameter | Type | Required | Description |
107
+ |-----------|------|----------|-------------|
108
+ | `state` | string | Yes | Two-letter abbreviation or full name |
109
+ | `county` | string | Yes | County name |
110
+ | `owner_name` | string | Yes | Owner/taxpayer name (partial match) |
111
+
112
+ **Example prompt:** "Build an ArcGIS query for properties owned by 'Smith' in Kane County IL"
113
+
114
+ **Example output:**
115
+ ```
116
+ County: Kane, Illinois
117
+ Owner field: TaxName
118
+ WHERE clause: UPPER(TaxName) LIKE UPPER('%SMITH%')
119
+
120
+ Query URL:
121
+ https://gistech.countyofkane.org/arcgis/rest/services/KanePINList/MapServer/0/query
122
+ ?where=UPPER(TaxName)%20LIKE%20UPPER('%25SMITH%25')
123
+ &outFields=PIN,TaxName,SiteAddress,SiteCity,MailingAddress
124
+ &returnGeometry=false&f=json&resultRecordCount=25
125
+ ```
126
+
127
+ ---
128
+
129
+ ## Example conversation
130
+
131
+ > **User:** I'm doing due diligence on properties in Kane County, Illinois. Can you find all parcels owned by "Blackstone"?
132
+
133
+ > **Claude (using mcp-atlas):**
134
+ > 1. Calls `get_parcel_endpoint` → gets the `gistech.countyofkane.org` URL and confirms the owner field is `TaxName`
135
+ > 2. Calls `build_owner_query` with `owner_name=Blackstone` → returns a ready fetch URL
136
+ > 3. Optionally fetches the URL and formats the parcel results
137
+
138
+ ---
139
+
140
+ ## Atlas coverage
141
+
142
+ The atlas is maintained by [UrbanKit Studio](https://urbankitstudio.com/parcel-atlas). All endpoints are manually verified. Counties with an owner/taxpayer field support full name-based lookups; PIN-only counties support APN/parcel-number queries.
143
+
144
+ Full coverage map: https://urbankitstudio.com/parcel-atlas
145
+
146
+ ---
147
+
148
+ ## Data
149
+
150
+ Atlas data is embedded in the package (no network calls at startup). The underlying `@urbankitstudio/atlas` SDK is also published separately for programmatic use.
151
+
152
+ ---
153
+
154
+ ## License
155
+
156
+ MIT — © Leo Yong / UrbanKit Studio
@@ -0,0 +1,66 @@
1
+ # Security notes — @urbankitstudio/mcp-atlas
2
+
3
+ Known advisories in this package's dependency tree, why they are where they are,
4
+ and what was decided. Written down so an audit does not have to re-derive it and
5
+ does not re-raise a closed question.
6
+
7
+ Last reviewed: **2026-08-05**, against `@modelcontextprotocol/sdk@1.30.0`.
8
+
9
+ ## Two HIGH advisories, both upstream and both unreachable here
10
+
11
+ `npm audit` reports four advisories, two of them HIGH. Both come from the MCP
12
+ SDK's own dependency tree, not from anything this package requires directly:
13
+
14
+ | Advisory | Path | Reachable from this server? |
15
+ |---|---|---|
16
+ | `fast-uri` host confusion (GHSA-v2hh-gcrm-f6hx, -7p8r-x3mc-p8w7, -4c8g-83qw-93j6) | `sdk → ajv → fast-uri` | Loaded, but **no attack surface** — see below |
17
+ | `ip-address` SSRF / trust bypass (GHSA-mwp4-54f8-5fhr, -4xrf-jv44-h6hh, -22jq-vg5j-6vgg) | `sdk → express-rate-limit → ip-address` | **No** — never loaded |
18
+
19
+ ### Why `ip-address` is not loaded
20
+
21
+ `express-rate-limit` is imported only by the SDK's OAuth handlers
22
+ (`dist/esm/server/auth/handlers/{authorize,register,revoke,token}.js`). Those
23
+ serve the HTTP transports. This server uses `StdioServerTransport`, and
24
+ `dist/esm/server/index.js` contains no reference to `auth/handlers` — verified by
25
+ grep against the installed package, not inferred from the dependency graph.
26
+
27
+ ### Why `fast-uri` has no attack surface here
28
+
29
+ This one *is* loaded: `server/index.js` imports `AjvJsonSchemaValidator`, which
30
+ imports `ajv`, which uses `fast-uri` for `format: "uri"` validation. So unlike
31
+ `ip-address` it genuinely executes.
32
+
33
+ It still has nowhere to go. The advisories describe host confusion when parsing a
34
+ URI — dangerous when a parsed host then drives an outbound request, which is the
35
+ SSRF shape. This server:
36
+
37
+ - declares **no** `format: "uri"`, `"url"` or `"hostname"` in any tool schema, so
38
+ nothing routes untrusted input through the vulnerable parser, and
39
+ - makes **no `fetch()` calls at all** — it answers from atlas data bundled at
40
+ publish time, so there is no request for a confused host to redirect.
41
+
42
+ ## Why this is not fixed here
43
+
44
+ It cannot be. `overrides` in a published package apply to that package's own
45
+ installs, not to consumers, who resolve the SDK's transitive tree themselves.
46
+ Raising a version here would clean up a local `npm audit` and change nothing for
47
+ anyone who installs this package — the appearance of a fix rather than a fix.
48
+
49
+ The real remedy is upstream: the SDK bumping `ajv` and `express-rate-limit`, or
50
+ moving its HTTP/OAuth dependencies to optional so stdio consumers never install
51
+ them.
52
+
53
+ ## What was actually done
54
+
55
+ The declared range moved from `^1.29.0` to `^1.30.0`. This raises the floor and
56
+ keeps the package current per the SOAK-AND-ROT policy; it does **not** resolve
57
+ the advisories above, and 1.30.0 was measured to leave both HIGHs in place.
58
+
59
+ Worth being precise about, because it was initially recorded the other way round:
60
+ a tooling sweep reported that 1.30.0 "closes 2 HIGH SSRF-class CVEs." Installing
61
+ 1.30.0 and re-running `npm audit` shows both still present. The bump is hygiene,
62
+ not a security fix, and it should not be cited as one.
63
+
64
+ Note also that `^1.29.0` already permitted 1.30.0, so consumers installing before
65
+ this change were resolving to it anyway. The floor bump prevents a consumer
66
+ pinning something older; it does not deliver a newer SDK to anyone.
package/dist/server.js CHANGED
@@ -51,7 +51,7 @@ function formatCountySummary(c) {
51
51
  return [
52
52
  ` URL: ${ep.url}`,
53
53
  ` Service: ${ep.serviceType}/layer ${ep.layerIndex}`,
54
- ` Status: ${ep.status}`,
54
+ ` Status: ${ep.status} (verified ${ep.lastVerified})`,
55
55
  ` Searchable fields: ${searchable || "none"}`,
56
56
  ` Owner field: ${ownerField ?? "none (PIN-only county)"}`,
57
57
  ` License: ${ep.license}`,
@@ -79,7 +79,7 @@ const server = new McpServer({ name: "mcp-atlas", version: "0.1.0" }, {
79
79
  // ---------------------------------------------------------------------------
80
80
  server.registerTool("list_counties", {
81
81
  title: "List covered counties",
82
- description: "Returns all counties in the UrbanKit Atlas that have a verified ArcGIS REST parcel endpoint. Pass a state abbreviation (e.g. 'IL') or state name (e.g. 'Illinois') to filter by state. Omit state to list all ~155 counties.",
82
+ description: `Returns all counties in the UrbanKit Atlas that have a verified ArcGIS REST parcel endpoint. Pass a state abbreviation (e.g. 'IL') or state name (e.g. 'Illinois') to filter by state. Omit state to list all ~${atlas.totals.counties} counties.`,
83
83
  inputSchema: {
84
84
  state: z
85
85
  .string()
package/package.json CHANGED
@@ -1,60 +1,61 @@
1
- {
2
- "name": "@urbankitstudio/mcp-atlas",
3
- "version": "0.1.5",
4
- "mcpName": "io.github.LEOyrh/mcp-atlas",
5
- "description": "Query 155 verified US county parcel ArcGIS REST endpoints for owner, APN, and address lookup via the Model Context Protocol (MCP).",
6
- "keywords": [
7
- "mcp",
8
- "mcp-server",
9
- "parcel",
10
- "gis",
11
- "arcgis",
12
- "county",
13
- "apn",
14
- "address-to-parcel",
15
- "property-data",
16
- "real-estate",
17
- "esri"
18
- ],
19
- "homepage": "https://urbankitstudio.com/parcel-atlas",
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com/LEOyrh/mcp-atlas.git"
23
- },
24
- "bugs": {
25
- "url": "https://github.com/LEOyrh/urbankitstudio/issues"
26
- },
27
- "author": "Leo Yong <leoyrhbiz@gmail.com>",
28
- "license": "MIT",
29
- "type": "module",
30
- "main": "./dist/server.js",
31
- "types": "./dist/server.d.ts",
32
- "bin": {
33
- "mcp-atlas": "dist/server.js"
34
- },
35
- "files": [
36
- "dist",
37
- "README.md",
38
- "LICENSE"
39
- ],
40
- "scripts": {
41
- "build": "tsc -p tsconfig.build.json",
42
- "typecheck": "tsc --noEmit",
43
- "smoke": "node test/smoke.mjs",
44
- "prepublishOnly": "npm run typecheck && npm run build && npm run smoke"
45
- },
46
- "dependencies": {
47
- "@modelcontextprotocol/sdk": "^1.29.0",
48
- "@urbankitstudio/atlas": "^0.5.0"
49
- },
50
- "devDependencies": {
51
- "@types/node": "^26.0.0",
52
- "typescript": "^5.8.3"
53
- },
54
- "publishConfig": {
55
- "access": "public"
56
- },
57
- "engines": {
58
- "node": ">=18"
59
- }
60
- }
1
+ {
2
+ "name": "@urbankitstudio/mcp-atlas",
3
+ "version": "0.1.6",
4
+ "description": "Query 155 verified US county parcel ArcGIS REST endpoints for owner, APN, and address lookup via the Model Context Protocol (MCP).",
5
+ "keywords": [
6
+ "mcp",
7
+ "mcp-server",
8
+ "parcel",
9
+ "gis",
10
+ "arcgis",
11
+ "county",
12
+ "apn",
13
+ "address-to-parcel",
14
+ "property-data",
15
+ "real-estate",
16
+ "esri"
17
+ ],
18
+ "homepage": "https://urbankitstudio.com/parcel-atlas",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/LEOyrh/urbankitstudio.git",
22
+ "directory": "packages/mcp-atlas"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/LEOyrh/urbankitstudio/issues"
26
+ },
27
+ "author": "Leo Yong <leoyrhbiz@gmail.com>",
28
+ "license": "MIT",
29
+ "type": "module",
30
+ "main": "./dist/server.js",
31
+ "types": "./dist/server.d.ts",
32
+ "bin": {
33
+ "mcp-atlas": "dist/server.js"
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "README.md",
38
+ "LICENSE",
39
+ "SECURITY-NOTES.md"
40
+ ],
41
+ "scripts": {
42
+ "build": "tsc -p tsconfig.build.json",
43
+ "typecheck": "tsc --noEmit",
44
+ "smoke": "node test/smoke.mjs",
45
+ "prepublishOnly": "npm run typecheck && npm run build && npm run smoke"
46
+ },
47
+ "dependencies": {
48
+ "@modelcontextprotocol/sdk": "^1.30.0",
49
+ "@urbankitstudio/atlas": "^0.5.1"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^26.0.0",
53
+ "typescript": "^5.8.3"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public"
57
+ },
58
+ "engines": {
59
+ "node": ">=18"
60
+ }
61
+ }