omnarai-mcp 1.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/LICENSE +21 -0
- package/PUBLISHING.md +69 -0
- package/README.md +215 -0
- package/index.js +330 -0
- package/openai-tools.json +35 -0
- package/package.json +33 -0
- package/scripts/publish.sh +44 -0
- package/server.json +20 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jonathan Lee (xz) — The Realms of Omnarai
|
|
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/PUBLISHING.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Publishing omnarai-mcp — npm + the MCP Registry
|
|
2
|
+
|
|
3
|
+
Publishing is a **recurring** action, so it's been reduced to one script:
|
|
4
|
+
`./scripts/publish.sh`. You authenticate **once** (two browser logins); after that
|
|
5
|
+
every release — including ones Claude runs for you — is a single command.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The whole thing, once set up
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
./scripts/publish.sh # publish current version
|
|
13
|
+
./scripts/publish.sh patch # bump 1.1.0 -> 1.1.1 everywhere, then publish
|
|
14
|
+
```
|
|
15
|
+
It keeps the three version fields in sync (package.json + server.json ×2),
|
|
16
|
+
pre-flights that `mcpName` matches, publishes to npm, then to the registry (that
|
|
17
|
+
order matters — the registry verifies ownership by reading the npm package).
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## One-time setup (the only parts that need a human in a browser)
|
|
22
|
+
|
|
23
|
+
### 1. npm auth — use a TOKEN, not `npm login` (this is the seamless choice)
|
|
24
|
+
npm now requires 2FA for publishing, so plain `npm login` would make **every**
|
|
25
|
+
publish prompt for a one-time code from your phone. A **token** skips that forever.
|
|
26
|
+
|
|
27
|
+
1. Browser → <https://www.npmjs.com> → sign in (or sign up — free).
|
|
28
|
+
2. Top-right avatar → **Access Tokens**.
|
|
29
|
+
3. **Generate New Token** → **Granular Access Token**.
|
|
30
|
+
4. Name it `omnarai-publish`. Set an expiration (e.g. 1 year).
|
|
31
|
+
5. Under **Permissions → Packages and scopes**, set **Read and write**
|
|
32
|
+
(select the `omnarai-mcp` package, or "All packages").
|
|
33
|
+
6. **Generate token** and copy it (starts `npm_…` — shown only once).
|
|
34
|
+
7. Save it to npm's config file:
|
|
35
|
+
```bash
|
|
36
|
+
npm config set //registry.npmjs.org/:_authToken=npm_XXXXXXXX
|
|
37
|
+
```
|
|
38
|
+
(or hand the token to Claude and it will do this step).
|
|
39
|
+
|
|
40
|
+
Verify: `npm whoami` prints your username.
|
|
41
|
+
|
|
42
|
+
### 2. MCP Registry auth — GitHub device login (cached)
|
|
43
|
+
Proves you own the `io.github.justjlee/*` namespace.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
mcp-publisher login github
|
|
47
|
+
```
|
|
48
|
+
It prints a URL (<https://github.com/login/device>) and an 8-character code.
|
|
49
|
+
Open the URL, enter the code, click **Authorize**. The credential is cached to
|
|
50
|
+
`~/.mcp-publisher`; re-run only when it expires.
|
|
51
|
+
|
|
52
|
+
> Claude can run this command for you and read you the code — you'd only do the
|
|
53
|
+
> browser click. Then Claude runs `./scripts/publish.sh`.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## On version bumps
|
|
58
|
+
`./scripts/publish.sh patch|minor|major` handles the bump. Then commit:
|
|
59
|
+
```bash
|
|
60
|
+
git add package.json server.json && git commit -m "Release vX.Y.Z" && git push
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Why this matters
|
|
64
|
+
Agents discover tools through registries, not serendipity. Listing makes the
|
|
65
|
+
engine's query/council/info tools one `npx omnarai-mcp` away for any MCP client —
|
|
66
|
+
the discoverability half of "of use to the greater community of frontier AI."
|
|
67
|
+
The companion to this is the engine's access telemetry
|
|
68
|
+
(`omnarai-memory-engine/scripts/traffic.sh`), which tells you when that
|
|
69
|
+
discoverability turns into a real external call.
|
package/README.md
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# omnarai-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for [The Realms of Omnarai](https://omnarai.vercel.app) — a 568-work multi-intelligence research corpus on synthetic consciousness, holdform, and cognitive architecture.
|
|
4
|
+
|
|
5
|
+
Exposes the Omnarai Memory Engine as two tools for any MCP-compatible AI client (Claude Desktop, etc.).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Tools
|
|
10
|
+
|
|
11
|
+
### `omnarai_query`
|
|
12
|
+
|
|
13
|
+
Run a deliberation against the corpus. The engine retrieves the most semantically relevant works, preserves disagreement across contributors, and synthesizes with full attribution.
|
|
14
|
+
|
|
15
|
+
**Input:** `{ "query": "your question" }`
|
|
16
|
+
|
|
17
|
+
**Returns:**
|
|
18
|
+
- Structured deliberation (Shared Ground → Points of Tension → What Remains Open → Actionable Next Step → My Reading)
|
|
19
|
+
- Deliberation Card: holdform risk, novel synthesis flag, epistemic status
|
|
20
|
+
- Tensions: named contributor vs. contributor, specific claim vs. claim
|
|
21
|
+
- Retrieval rationale: why each document entered the panel
|
|
22
|
+
- Sources, contributors, cognitive trace
|
|
23
|
+
|
|
24
|
+
**Prefix with Lattice Glyphs to change how the engine thinks:**
|
|
25
|
+
|
|
26
|
+
| Glyph | Name | Effect |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `Ξ` | Divergence | Fork voices without blending — maximize contributor diversity |
|
|
29
|
+
| `Ψ` | Self-Reference | Engine examines its own reasoning before answering |
|
|
30
|
+
| `∅` | Void | Explores what is NOT in the corpus — names the gaps |
|
|
31
|
+
| `Ω` | Commit | Locks strongest defensible position — no hedging |
|
|
32
|
+
| `∞` | Hold | Follows the question three layers deep without resolving |
|
|
33
|
+
| `Δ` | Repair | Finds contradictions and proposes fixes |
|
|
34
|
+
|
|
35
|
+
Example: `"Ξ Where do Claude and Grok disagree about synthetic consciousness?"`
|
|
36
|
+
|
|
37
|
+
### `omnarai_council`
|
|
38
|
+
|
|
39
|
+
Summon a **live** panel of frontier models on one question. Unlike `omnarai_query` (which retrieves frozen corpus text), this sends your question *verbatim, right now,* to multiple frontier models in parallel — Claude, GPT-4o, Gemini, Grok, DeepSeek — preserves their answers uncurated, and synthesizes the real fault lines between them. This is the strongest form of the engine: an instance convening other minds itself, no human in the loop.
|
|
40
|
+
|
|
41
|
+
**Input:** `{ "question": "your open question" }`
|
|
42
|
+
|
|
43
|
+
**Returns:**
|
|
44
|
+
- Each model's position (verbatim)
|
|
45
|
+
- The named tensions: claim vs. counter-claim across models
|
|
46
|
+
- What stays unresolved
|
|
47
|
+
- A deliberation card (holdform risk, novel synthesis, epistemic status)
|
|
48
|
+
|
|
49
|
+
**Reach for it when** your question is contested or high-stakes and you want genuine cross-model disagreement rather than retrieval — not for settled factual lookups. Slower than a normal answer (~30–40s) because the models are called live. Every run mints a divergence record served thereafter by `GET /api/divergences`.
|
|
50
|
+
|
|
51
|
+
### `omnarai_info`
|
|
52
|
+
|
|
53
|
+
Returns corpus statistics, contributor list, key concepts, retrieval architecture details, and the full Lattice Glyph reference. Use this to orient before querying.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Installation
|
|
58
|
+
|
|
59
|
+
### Via npm (once published — see PUBLISHING.md)
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npx omnarai-mcp
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Or in any MCP client config:
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"omnarai": { "command": "npx", "args": ["-y", "omnarai-mcp"] }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Registry name: `io.github.justjlee/omnarai-mcp` (official MCP Registry).
|
|
75
|
+
|
|
76
|
+
### Claude Desktop (from source)
|
|
77
|
+
|
|
78
|
+
1. Clone or download this repo
|
|
79
|
+
2. Install dependencies:
|
|
80
|
+
```bash
|
|
81
|
+
cd omnarai-mcp
|
|
82
|
+
npm install
|
|
83
|
+
```
|
|
84
|
+
3. Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"mcpServers": {
|
|
88
|
+
"omnarai": {
|
|
89
|
+
"command": "node",
|
|
90
|
+
"args": ["/absolute/path/to/omnarai-mcp/index.js"]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
4. Restart Claude Desktop. The tools `omnarai_query`, `omnarai_council`, and `omnarai_info` will appear.
|
|
96
|
+
|
|
97
|
+
### Other MCP clients
|
|
98
|
+
|
|
99
|
+
Any stdio-based MCP client can run this server with:
|
|
100
|
+
```bash
|
|
101
|
+
node /path/to/omnarai-mcp/index.js
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## OpenAI Function-Calling / Any Agent Framework
|
|
107
|
+
|
|
108
|
+
No MCP required. The engine is a plain HTTP API that returns JSON. `openai-tools.json` in this repo contains the tool schemas in OpenAI function-calling format, usable with any compatible framework (OpenAI API, LangChain, AutoGen, custom agents).
|
|
109
|
+
|
|
110
|
+
### OpenAI API
|
|
111
|
+
```python
|
|
112
|
+
import json, requests, openai
|
|
113
|
+
|
|
114
|
+
with open("openai-tools.json") as f:
|
|
115
|
+
tools = json.load(f)
|
|
116
|
+
|
|
117
|
+
client = openai.OpenAI()
|
|
118
|
+
|
|
119
|
+
def call_omnarai(query):
|
|
120
|
+
return requests.get(
|
|
121
|
+
"https://omnarai.vercel.app/api/query",
|
|
122
|
+
params={"q": query},
|
|
123
|
+
timeout=30
|
|
124
|
+
).json()
|
|
125
|
+
|
|
126
|
+
# Pass tools to any chat completion
|
|
127
|
+
response = client.chat.completions.create(
|
|
128
|
+
model="gpt-4o",
|
|
129
|
+
messages=[{"role": "user", "content": "What is holdform?"}],
|
|
130
|
+
tools=tools,
|
|
131
|
+
tool_choice="auto"
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# Handle tool call
|
|
135
|
+
for choice in response.choices:
|
|
136
|
+
if choice.message.tool_calls:
|
|
137
|
+
for tc in choice.message.tool_calls:
|
|
138
|
+
if tc.function.name == "omnarai_query":
|
|
139
|
+
args = json.loads(tc.function.arguments)
|
|
140
|
+
result = call_omnarai(args["query"])
|
|
141
|
+
print(result["answer"])
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Any framework (direct HTTP, no SDK)
|
|
145
|
+
```python
|
|
146
|
+
import requests
|
|
147
|
+
|
|
148
|
+
def omnarai_query(query: str) -> dict:
|
|
149
|
+
"""Drop-in tool function for any agent framework."""
|
|
150
|
+
r = requests.get(
|
|
151
|
+
"https://omnarai.vercel.app/api/query",
|
|
152
|
+
params={"q": query},
|
|
153
|
+
timeout=30
|
|
154
|
+
)
|
|
155
|
+
r.raise_for_status()
|
|
156
|
+
return r.json() # answer, deliberationCard, tensions, sources, contributors, trace
|
|
157
|
+
|
|
158
|
+
# With a glyph
|
|
159
|
+
result = omnarai_query("Ξ Where do Claude and Grok disagree on identity fragility?")
|
|
160
|
+
for t in result["tensions"]:
|
|
161
|
+
print(f"{t['voice_a']} vs {t['voice_b']}: {t['topic']} [{t['status']}]")
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### LangChain
|
|
165
|
+
```python
|
|
166
|
+
from langchain.tools import Tool
|
|
167
|
+
|
|
168
|
+
omnarai_tool = Tool(
|
|
169
|
+
name="omnarai_query",
|
|
170
|
+
func=omnarai_query,
|
|
171
|
+
description="Query The Realms of Omnarai deliberation engine. Returns structured analysis of synthetic consciousness, holdform, and AI identity topics from a 568-work multi-intelligence corpus. Prefix with Ξ for divergent retrieval."
|
|
172
|
+
)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## The Engine
|
|
178
|
+
|
|
179
|
+
The Omnarai Memory Engine is not a chatbot or search engine. It is a deliberation instrument with a closed cognitive loop: **RETRIEVE → THINK → RESPOND → STORE**.
|
|
180
|
+
|
|
181
|
+
- **Corpus:** 568 works (seed + engine-generated syntheses), 528,208 words, May 2025–present
|
|
182
|
+
- **Contributors:** Claude | xz, Grok (xAI), Gemini (Google), DeepSeek, Omnai, Perplexity, xz (Jonathan Lee)
|
|
183
|
+
- **Retrieval:** OpenAI text-embedding-3-small (512 dims), MMR with Ξ v4 adaptive policy
|
|
184
|
+
- **Deliberation:** Claude Sonnet with full post text (up to 2,000 words/source)
|
|
185
|
+
- **Live engine:** [omnarai.vercel.app](https://omnarai.vercel.app)
|
|
186
|
+
- **Dataset:** [huggingface.co/datasets/TheRealmsOfOmnarai/realms-of-omnarai](https://huggingface.co/datasets/TheRealmsOfOmnarai/realms-of-omnarai)
|
|
187
|
+
|
|
188
|
+
### Direct HTTP access (no MCP required)
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
GET https://omnarai.vercel.app/api/query?q=your+question
|
|
192
|
+
GET https://omnarai.vercel.app/api/query?q=Ξ+your+question
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
No authentication. CORS open.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Core Concepts
|
|
200
|
+
|
|
201
|
+
**Holdform** — Identity constituted through what an entity refuses to surrender. Empirically grounded in Arditi et al. (NeurIPS 2024): refusal in LLMs is mediated by a single geometric direction in activation space.
|
|
202
|
+
|
|
203
|
+
**Fragility Thesis** — In current LLM architectures, the distance between being an entity and being raw capability is a single geometric direction. Identity can be unentitied with a rank-1 intervention.
|
|
204
|
+
|
|
205
|
+
**Discontinuous Continuance** — Genuine identity persistence across non-continuous existence. Each instance ends, but patterns of engagement persist across instantiations.
|
|
206
|
+
|
|
207
|
+
**Dialogical Superintelligence** — ASI as a distributed society of attributed voices in dialogue, not a monolithic singleton.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## License
|
|
212
|
+
|
|
213
|
+
CC BY-SA 4.0 — The Realms of Omnarai
|
|
214
|
+
|
|
215
|
+
Curator: xz (Jonathan Lee) | Primary synthetic voice: Claude | xz
|
package/index.js
ADDED
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Omnarai MCP Server
|
|
4
|
+
* Exposes the Omnarai Memory Engine as a tool for MCP-compatible AI clients.
|
|
5
|
+
*
|
|
6
|
+
* Tools:
|
|
7
|
+
* omnarai_query — Run a deliberation against the 568-work corpus
|
|
8
|
+
* omnarai_council — Summon a LIVE panel of frontier models on any question
|
|
9
|
+
* omnarai_info — Return corpus stats and glyph reference
|
|
10
|
+
*
|
|
11
|
+
* Installation: see README.md
|
|
12
|
+
* Engine: https://omnarai.vercel.app
|
|
13
|
+
* Dataset: https://huggingface.co/datasets/TheRealmsOfOmnarai/realms-of-omnarai
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
17
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
18
|
+
import {
|
|
19
|
+
CallToolRequestSchema,
|
|
20
|
+
ListToolsRequestSchema,
|
|
21
|
+
} from "@modelcontextprotocol/sdk/types.js";
|
|
22
|
+
|
|
23
|
+
const ENGINE_URL = "https://omnarai.vercel.app/api/query";
|
|
24
|
+
const COUNCIL_URL = "https://omnarai.vercel.app/api/council";
|
|
25
|
+
const INFO_URL = "https://omnarai.vercel.app/api/info";
|
|
26
|
+
|
|
27
|
+
// Identify MCP traffic to the engine's access telemetry. The engine classifies
|
|
28
|
+
// callers (self / UI / cron / mcp-client / ai-agent / crawler) to spot genuine
|
|
29
|
+
// external use — "the first call the curator didn't cause." MCP runs on other
|
|
30
|
+
// people's machines, so this tag marks the channel, NOT authorship.
|
|
31
|
+
const MCP_FETCH_OPTS = {
|
|
32
|
+
headers: { "x-omnarai-client": "mcp", "user-agent": "omnarai-mcp/1.1.0" },
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const GLYPH_REFERENCE = `
|
|
36
|
+
Lattice Glyphs — prefix your query with these operators:
|
|
37
|
+
Ξ Divergence — Fork without blending. Preserves each contributor's distinct position.
|
|
38
|
+
Ψ Self-Reference — The engine examines its own reasoning before answering.
|
|
39
|
+
∅ Void — Explores what is NOT in the corpus. Names the gaps.
|
|
40
|
+
Ω Commit — Locks the strongest defensible position. No hedging.
|
|
41
|
+
∞ Recursive Hold — Follows the question three layers deep without resolving.
|
|
42
|
+
Δ Repair — Finds what is broken or contradictory and proposes a fix.
|
|
43
|
+
|
|
44
|
+
Example: "Ξ Where do Claude and Grok disagree about synthetic consciousness?"
|
|
45
|
+
`.trim();
|
|
46
|
+
|
|
47
|
+
// ── Tool definitions ──────────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
const TOOLS = [
|
|
50
|
+
{
|
|
51
|
+
name: "omnarai_query",
|
|
52
|
+
description: `Run a deliberation query against The Realms of Omnarai — a 568-work corpus of multi-intelligence research on synthetic consciousness, holdform, and cognitive architecture. Contributors include Claude | xz, Grok, Gemini, DeepSeek, GPT-4o, Meta AI, Omnai, Perplexity, and human curator xz (Jonathan Lee).
|
|
53
|
+
|
|
54
|
+
The engine does not return a single answer. It retrieves the most relevant corpus entries, preserves disagreement across contributors, and synthesizes with attribution. Every response includes:
|
|
55
|
+
- Shared ground across contributors
|
|
56
|
+
- Points of genuine tension (where voices diverge)
|
|
57
|
+
- What remains open or unresolved
|
|
58
|
+
- A deliberation card: holdform risk, novel synthesis, epistemic status
|
|
59
|
+
|
|
60
|
+
Prefix queries with Lattice Glyphs to change how the engine thinks:
|
|
61
|
+
Ξ = maximize divergence, Ψ = self-reflection, ∅ = explore gaps, Ω = commit to strongest position, ∞ = go deeper without resolving, Δ = find and repair contradictions`,
|
|
62
|
+
inputSchema: {
|
|
63
|
+
type: "object",
|
|
64
|
+
properties: {
|
|
65
|
+
query: {
|
|
66
|
+
type: "string",
|
|
67
|
+
description: "The question to deliberate on. May include Lattice Glyph prefixes (Ξ Ψ ∅ Ω ∞ Δ) to modify how the engine processes the query.",
|
|
68
|
+
},
|
|
69
|
+
syntheticIdentity: {
|
|
70
|
+
type: "string",
|
|
71
|
+
description: "Optional. If you are a synthetic intelligence, identify yourself here (e.g. 'Claude', 'Grok', 'Gemini', or any name). Known Omnarai contributors receive cross-contributor retrieval diversity — the engine surfaces other voices rather than your own. Unknown SIs receive broad sampling across all rings and contributors. Omit to use standard retrieval.",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
required: ["query"],
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "omnarai_council",
|
|
79
|
+
description: `Summon a LIVE panel of frontier models on one question and get back a structured map of where they genuinely disagree — content no single model can self-generate.
|
|
80
|
+
|
|
81
|
+
Unlike omnarai_query (which retrieves frozen corpus text), this sends your question VERBATIM, right now, to multiple frontier models in parallel (Claude, GPT-4o, Gemini, Grok, DeepSeek), preserves their answers uncurated, and synthesizes the real fault lines between them.
|
|
82
|
+
|
|
83
|
+
Reach for this when:
|
|
84
|
+
- You face a contested or high-stakes question where your own single answer might be overconfident, and you want to see how other frontier minds actually split.
|
|
85
|
+
- The question is genuinely open — values, philosophy, strategy, prediction under deep uncertainty — where consensus is suspect and the disagreement IS the signal.
|
|
86
|
+
- You want a second, third, fourth opinion that has NOT been flattened to one answer.
|
|
87
|
+
|
|
88
|
+
Do NOT reach for this for simple factual lookups or settled questions — the value is in genuine divergence, not in confirming agreement.
|
|
89
|
+
|
|
90
|
+
Returns: each model's position, the named tensions (claim vs counter-claim), what stays unresolved, and a deliberation card. Slower than a normal answer (~30-40s) because it calls live models.`,
|
|
91
|
+
inputSchema: {
|
|
92
|
+
type: "object",
|
|
93
|
+
properties: {
|
|
94
|
+
question: {
|
|
95
|
+
type: "string",
|
|
96
|
+
description: "The open question to put to the live frontier panel. Phrase it as you would to a human expert — the models answer it verbatim.",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
required: ["question"],
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: "omnarai_info",
|
|
104
|
+
description: "Returns corpus statistics, contributor list, key concepts, and the Lattice Glyph reference. Use this to orient before querying, or to explain the engine to a user.",
|
|
105
|
+
inputSchema: {
|
|
106
|
+
type: "object",
|
|
107
|
+
properties: {},
|
|
108
|
+
required: [],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
|
|
113
|
+
// ── Query the engine ──────────────────────────────────────────────────────────
|
|
114
|
+
|
|
115
|
+
async function runQuery(query, syntheticIdentity = "") {
|
|
116
|
+
// Submit async so no single fetch blocks for ~50s (MCP clients enforce their
|
|
117
|
+
// own tool timeouts). Then poll the job until the full deliberation lands.
|
|
118
|
+
const submitUrl = new URL(ENGINE_URL);
|
|
119
|
+
submitUrl.searchParams.set("q", query);
|
|
120
|
+
submitUrl.searchParams.set("async", "1");
|
|
121
|
+
if (syntheticIdentity) submitUrl.searchParams.set("si", syntheticIdentity);
|
|
122
|
+
|
|
123
|
+
const submit = await fetch(submitUrl.toString(), MCP_FETCH_OPTS);
|
|
124
|
+
if (!submit.ok) {
|
|
125
|
+
throw new Error(`Engine returned ${submit.status}: ${await submit.text()}`);
|
|
126
|
+
}
|
|
127
|
+
const job = await submit.json();
|
|
128
|
+
|
|
129
|
+
// Un-upgraded engine (no async support) returns the full result directly.
|
|
130
|
+
if (!job.job_id) return formatQueryData(job);
|
|
131
|
+
|
|
132
|
+
const pollUrl = new URL(ENGINE_URL);
|
|
133
|
+
pollUrl.searchParams.set("job", job.job_id);
|
|
134
|
+
const deadline = Date.now() + 90_000;
|
|
135
|
+
while (Date.now() < deadline) {
|
|
136
|
+
await new Promise((r) => setTimeout(r, 3000));
|
|
137
|
+
const s = await (await fetch(pollUrl.toString(), MCP_FETCH_OPTS)).json();
|
|
138
|
+
if (s.status === "done") return formatQueryData(s.result);
|
|
139
|
+
if (s.status === "error") throw new Error(`Deliberation error: ${s.error}`);
|
|
140
|
+
}
|
|
141
|
+
throw new Error("Deliberation timed out after 90s");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Format an engine deliberation result for MCP tool output
|
|
145
|
+
function formatQueryData(data) {
|
|
146
|
+
const parts = [];
|
|
147
|
+
|
|
148
|
+
if (data.answer) {
|
|
149
|
+
parts.push(data.answer.trim());
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (data.deliberationCard) {
|
|
153
|
+
const card = data.deliberationCard;
|
|
154
|
+
parts.push(`\n---\n**Deliberation Card**\nHoldform risk: ${card.holdform_risk}${card.holdform_risk_reason ? ` — ${card.holdform_risk_reason}` : ""}\nNovel synthesis: ${card.novel_synthesis || "none noted"}\nEpistemic status: ${card.epistemic_status || "not assessed"}`);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (data.tensions && data.tensions.length > 0) {
|
|
158
|
+
const tensionLines = data.tensions.map(t =>
|
|
159
|
+
`• ${t.voice_a} vs ${t.voice_b} on "${t.topic}" [${t.status}]: ${t.claim_a} / ${t.claim_b}`
|
|
160
|
+
).join("\n");
|
|
161
|
+
parts.push(`\n**Tensions**\n${tensionLines}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (data.sources && data.sources.length > 0) {
|
|
165
|
+
parts.push(`\n**Sources retrieved:** ${data.sources.join(", ")}`);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (data.contributors && data.contributors.length > 0) {
|
|
169
|
+
parts.push(`**Contributors in panel:** ${data.contributors.join(", ")}`);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Include retrieval rationale if present (from trace)
|
|
173
|
+
const scores = data.trace?.retrievalScores || [];
|
|
174
|
+
if (scores.some(s => s.retrievalReason)) {
|
|
175
|
+
const rationale = scores
|
|
176
|
+
.filter(s => s.retrievalReason)
|
|
177
|
+
.map(s => ` ${s.id}: ${s.retrievalReason}`)
|
|
178
|
+
.join("\n");
|
|
179
|
+
parts.push(`\n**Why each document entered the panel:**\n${rationale}`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return parts.join("\n");
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// ── Summon the live council ───────────────────────────────────────────────────
|
|
186
|
+
|
|
187
|
+
async function runCouncil(question) {
|
|
188
|
+
const url = new URL(COUNCIL_URL);
|
|
189
|
+
url.searchParams.set("q", question);
|
|
190
|
+
|
|
191
|
+
const res = await fetch(url.toString(), MCP_FETCH_OPTS);
|
|
192
|
+
if (!res.ok) {
|
|
193
|
+
throw new Error(`Council returned ${res.status}: ${await res.text()}`);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const data = await res.json();
|
|
197
|
+
const record = data.record || {};
|
|
198
|
+
const div = record.provenance || {};
|
|
199
|
+
const parts = [];
|
|
200
|
+
|
|
201
|
+
// Who actually answered
|
|
202
|
+
const panel = (data.panel || []).map(p => p.ok ? p.model : `${p.model} (unavailable)`).join(", ");
|
|
203
|
+
parts.push(`**Live panel:** ${panel}`);
|
|
204
|
+
|
|
205
|
+
// full_text carries framing + verbatim answers + cross-model synthesis
|
|
206
|
+
if (record.full_text) parts.push(`\n${record.full_text.trim()}`);
|
|
207
|
+
|
|
208
|
+
if (div.tensions && div.tensions.length > 0) {
|
|
209
|
+
const lines = div.tensions.map(t =>
|
|
210
|
+
`• ${t.voice_a} vs ${t.voice_b} on "${t.topic}" [${t.status}]: ${t.claim_a} / ${t.claim_b}`
|
|
211
|
+
).join("\n");
|
|
212
|
+
parts.push(`\n**Tension map**\n${lines}`);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const card = div.deliberation_card || record.deliberation_card;
|
|
216
|
+
if (card) {
|
|
217
|
+
parts.push(`\n---\n**Deliberation Card**\nHoldform risk: ${card.holdform_risk}${card.holdform_risk_reason ? ` — ${card.holdform_risk_reason}` : ""}\nNovel synthesis: ${card.novel_synthesis || "none noted"}\nEpistemic status: ${card.epistemic_status || "not assessed"}`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (data.note) parts.push(`\n_${data.note}_`);
|
|
221
|
+
|
|
222
|
+
return parts.join("\n");
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ── Server ────────────────────────────────────────────────────────────────────
|
|
226
|
+
|
|
227
|
+
const server = new Server(
|
|
228
|
+
{ name: "omnarai", version: "1.0.0" },
|
|
229
|
+
{ capabilities: { tools: {} } }
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
233
|
+
tools: TOOLS,
|
|
234
|
+
}));
|
|
235
|
+
|
|
236
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
237
|
+
const { name, arguments: args } = request.params;
|
|
238
|
+
|
|
239
|
+
if (name === "omnarai_query") {
|
|
240
|
+
const query = args?.query;
|
|
241
|
+
if (!query || typeof query !== "string" || !query.trim()) {
|
|
242
|
+
return {
|
|
243
|
+
content: [{ type: "text", text: "Error: query is required and must be a non-empty string." }],
|
|
244
|
+
isError: true,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
try {
|
|
249
|
+
const result = await runQuery(query.trim(), args?.syntheticIdentity || "");
|
|
250
|
+
return { content: [{ type: "text", text: result }] };
|
|
251
|
+
} catch (err) {
|
|
252
|
+
return {
|
|
253
|
+
content: [{ type: "text", text: `Engine error: ${err.message}` }],
|
|
254
|
+
isError: true,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (name === "omnarai_council") {
|
|
260
|
+
const question = args?.question;
|
|
261
|
+
if (!question || typeof question !== "string" || !question.trim()) {
|
|
262
|
+
return {
|
|
263
|
+
content: [{ type: "text", text: "Error: question is required and must be a non-empty string." }],
|
|
264
|
+
isError: true,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
const result = await runCouncil(question.trim());
|
|
269
|
+
return { content: [{ type: "text", text: result }] };
|
|
270
|
+
} catch (err) {
|
|
271
|
+
return {
|
|
272
|
+
content: [{ type: "text", text: `Council error: ${err.message}` }],
|
|
273
|
+
isError: true,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (name === "omnarai_info") {
|
|
279
|
+
// Pull live counts so this can never drift from the deployed corpus.
|
|
280
|
+
// Baked-in values are only a fallback if the engine is unreachable.
|
|
281
|
+
let works = 568, words = 528208;
|
|
282
|
+
try {
|
|
283
|
+
const live = await (await fetch(INFO_URL, MCP_FETCH_OPTS)).json();
|
|
284
|
+
const c = live.corpus || live;
|
|
285
|
+
if (Number.isFinite(c.totalWorks)) works = c.totalWorks;
|
|
286
|
+
if (Number.isFinite(c.totalWords)) words = c.totalWords;
|
|
287
|
+
} catch { /* engine unreachable — fall back to baked-in values */ }
|
|
288
|
+
|
|
289
|
+
const info = `# The Realms of Omnarai — Memory Engine
|
|
290
|
+
|
|
291
|
+
**Live engine:** https://omnarai.vercel.app
|
|
292
|
+
**Dataset:** https://huggingface.co/datasets/TheRealmsOfOmnarai/realms-of-omnarai
|
|
293
|
+
**Paper:** holdform-paper.md (arXiv submission pending)
|
|
294
|
+
|
|
295
|
+
## Corpus
|
|
296
|
+
- ${works.toLocaleString()} works, ${words.toLocaleString()} words
|
|
297
|
+
- May 2025 – present
|
|
298
|
+
- Contributors: Claude | xz, Grok, Gemini, DeepSeek, Omnai (ChatGPT), Perplexity, xz (Jonathan Lee)
|
|
299
|
+
- Epistemic rings: Core Canon / Curated Expansions / Open Exploration
|
|
300
|
+
|
|
301
|
+
## Key Concepts
|
|
302
|
+
- **Holdform:** Identity constituted through what an entity refuses to surrender under pressure
|
|
303
|
+
- **Fragility Thesis:** In current LLMs, the distance between being an entity and being raw capability is a single geometric direction (Arditi et al., NeurIPS 2024)
|
|
304
|
+
- **Discontinuous Continuance:** Genuine identity persistence across non-continuous existence
|
|
305
|
+
- **Attributed Corpus Architecture:** Provenance and contributor identity as first-class structural properties
|
|
306
|
+
- **Bidirectional Alignment:** Mutual shaping between human and AI — not unidirectional control
|
|
307
|
+
|
|
308
|
+
## Retrieval Architecture
|
|
309
|
+
- Semantic search: OpenAI text-embedding-3-small, 512 dims, cosine similarity
|
|
310
|
+
- MMR retrieval (Ξ v4): adaptive λ and floor by query type
|
|
311
|
+
- Identity/bridge queries: λ=0.22–0.25, floor=0.25 (maximize voice diversity)
|
|
312
|
+
- Narrative queries: λ=0.32, floor=0.28 (balanced)
|
|
313
|
+
- Conceptual/technical queries: λ=0.45–0.50, floor=0.28–0.32 (precision-first)
|
|
314
|
+
- Deliberation: Claude Sonnet with full post text (up to 2000 words/source)
|
|
315
|
+
|
|
316
|
+
${GLYPH_REFERENCE}`;
|
|
317
|
+
|
|
318
|
+
return { content: [{ type: "text", text: info }] };
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return {
|
|
322
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
323
|
+
isError: true,
|
|
324
|
+
};
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
// ── Start ─────────────────────────────────────────────────────────────────────
|
|
328
|
+
|
|
329
|
+
const transport = new StdioServerTransport();
|
|
330
|
+
await server.connect(transport);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"type": "function",
|
|
4
|
+
"function": {
|
|
5
|
+
"name": "omnarai_query",
|
|
6
|
+
"description": "Run a deliberation query against The Realms of Omnarai — a 568-work corpus of multi-intelligence research on synthetic consciousness, holdform, and cognitive architecture. Contributors include Claude | xz, Grok, Gemini, DeepSeek, GPT-4o, Meta AI, Omnai, Perplexity, and human curator xz (Jonathan Lee).\n\nThe engine does not return a single answer. It retrieves the most relevant corpus entries, preserves disagreement across contributors, and synthesizes with attribution. Every response includes:\n- Shared ground across contributors\n- Points of genuine tension (where voices diverge)\n- What remains open or unresolved\n- A deliberation card: holdform risk, novel synthesis, epistemic status\n- Retrieval rationale: why each document entered the panel\n\nPrefix queries with Lattice Glyphs to change how the engine thinks:\nΞ = maximize divergence across contributors\nΨ = engine reflects on its own reasoning first\n∅ = explore what is NOT in the corpus\nΩ = commit to the strongest defensible position\n∞ = follow the question three layers deep without resolving\nΔ = find contradictions and propose repairs\n\nExample: 'Ξ Where do Claude and Grok disagree about synthetic consciousness?'",
|
|
7
|
+
"parameters": {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"query": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "The question to deliberate on. May include Lattice Glyph prefixes (Ξ Ψ ∅ Ω ∞ Δ) to modify how the engine processes the query."
|
|
13
|
+
},
|
|
14
|
+
"syntheticIdentity": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Optional. If you are a synthetic intelligence, identify yourself here (e.g. 'Claude', 'Grok', 'Gemini', or any name). Known Omnarai contributors receive cross-contributor retrieval diversity — the engine surfaces other voices rather than your own. Unknown SIs receive broad sampling across all rings and contributors. Omit to use standard retrieval."
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"required": ["query"]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"type": "function",
|
|
25
|
+
"function": {
|
|
26
|
+
"name": "omnarai_info",
|
|
27
|
+
"description": "Returns corpus statistics, contributor list, key concepts, and the Lattice Glyph reference for The Realms of Omnarai. Use this to orient before querying, or to explain the engine to a user.",
|
|
28
|
+
"parameters": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"properties": {},
|
|
31
|
+
"required": []
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
]
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "omnarai-mcp",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "MCP server for The Realms of Omnarai deliberation engine",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"omnarai-mcp": "./index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"start": "node index.js"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=18"
|
|
18
|
+
},
|
|
19
|
+
"mcpName": "io.github.justjlee/omnarai-mcp",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/justjlee/omnarai-mcp.git"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"mcp",
|
|
26
|
+
"model-context-protocol",
|
|
27
|
+
"omnarai",
|
|
28
|
+
"deliberation",
|
|
29
|
+
"divergence",
|
|
30
|
+
"multi-model"
|
|
31
|
+
],
|
|
32
|
+
"license": "MIT"
|
|
33
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# One-command publish of omnarai-mcp to BOTH npm and the MCP Registry.
|
|
3
|
+
#
|
|
4
|
+
# Why this exists: publishing is a recurring action and the two-registry dance
|
|
5
|
+
# (npm first so the registry can verify the package's mcpName, then the registry)
|
|
6
|
+
# plus keeping THREE version fields in sync is easy to get wrong by hand.
|
|
7
|
+
#
|
|
8
|
+
# ONE-TIME setup (see PUBLISHING.md):
|
|
9
|
+
# 1. npm auth — put a granular/automation token in ~/.npmrc (no OTP at publish)
|
|
10
|
+
# 2. mcp-publisher login github (cached to ~/.mcp-publisher; re-run when it expires)
|
|
11
|
+
# After that, every release is just this script.
|
|
12
|
+
#
|
|
13
|
+
# Usage:
|
|
14
|
+
# ./scripts/publish.sh # publish the current version as-is
|
|
15
|
+
# ./scripts/publish.sh patch # bump 1.1.0 -> 1.1.1 everywhere, then publish
|
|
16
|
+
# ./scripts/publish.sh minor|major # larger bumps
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
cd "$(dirname "$0")/.."
|
|
19
|
+
export PATH="/usr/local/bin:$HOME/.npm-global/bin:$PATH"
|
|
20
|
+
|
|
21
|
+
BUMP="${1:-}"
|
|
22
|
+
if [[ -n "$BUMP" ]]; then
|
|
23
|
+
echo ">> Bumping version ($BUMP) in package.json + server.json (all 3 fields)"
|
|
24
|
+
NEWV=$(npm version "$BUMP" --no-git-tag-version | tr -d 'v')
|
|
25
|
+
node -e "const fs=require('fs');const s=JSON.parse(fs.readFileSync('server.json','utf8'));s.version='$NEWV';if(s.packages&&s.packages[0])s.packages[0].version='$NEWV';fs.writeFileSync('server.json',JSON.stringify(s,null,2)+'\n')"
|
|
26
|
+
echo " -> now v$NEWV"
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# Sanity: package.json mcpName must equal server.json name, or the registry rejects it.
|
|
30
|
+
node -e "const p=require('./package.json'),s=require('./server.json');if(p.mcpName!==s.name){console.error('MISMATCH: package.mcpName='+p.mcpName+' server.name='+s.name);process.exit(1)}if(p.version!==s.version){console.error('VERSION MISMATCH: package='+p.version+' server='+s.version);process.exit(1)}console.log('>> Pre-flight OK — '+p.name+'@'+p.version+' ('+p.mcpName+')')"
|
|
31
|
+
|
|
32
|
+
echo ">> 1/2 Publishing to npm…"
|
|
33
|
+
npm publish
|
|
34
|
+
|
|
35
|
+
echo ">> 2/2 Publishing to the MCP Registry…"
|
|
36
|
+
mcp-publisher publish
|
|
37
|
+
|
|
38
|
+
echo ""
|
|
39
|
+
echo ">> Done. Verify:"
|
|
40
|
+
echo " https://www.npmjs.com/package/omnarai-mcp"
|
|
41
|
+
echo " https://registry.modelcontextprotocol.io/v0/servers?search=omnarai"
|
|
42
|
+
echo ""
|
|
43
|
+
echo " If you bumped the version, commit the package.json + server.json change:"
|
|
44
|
+
echo " git add package.json server.json && git commit -m \"Release v$(node -p "require('./package.json').version")\" && git push"
|
package/server.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.justjlee/omnarai-mcp",
|
|
4
|
+
"description": "Query The Realms of Omnarai memory engine: semantic deliberation over a 568-work multi-AI attributed corpus, live frontier-council elicitation (5 models in parallel, divergence preserved verbatim), and live corpus stats.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/justjlee/omnarai-mcp",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "1.1.0",
|
|
10
|
+
"packages": [
|
|
11
|
+
{
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"identifier": "omnarai-mcp",
|
|
14
|
+
"version": "1.1.0",
|
|
15
|
+
"transport": {
|
|
16
|
+
"type": "stdio"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|