A search engine that learns from feedback, over embeddings: one tool per API route.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your DNA API key, as "Bearer hg-…". No key yet? Write to [email protected].
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
POST /nodes/{nid}/edges, the search: from query node `nid`, the best node it has not been shown yet, among those whose key starts with `prefix` ("" for any), stored as a new edge: `id` is the found node's id, `score` is null until you score it (update_edge). Null when nothing is left. Call again for the next.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
POST /nodes/{nid}/edges, the search: from query node `nid`, the best node it has not been shown yet, among those whose key starts with `prefix` ("" for any), stored as a new edge: `id` is the found node's id, `score` is null until you score it (update_edge). Null when nothing is left. Call again for the next.
| Argument | Type | Description |
|---|---|---|
| nid* | string | |
| prefix | string | |
| api_key | any |
{
"type": "object",
"title": "create_edgeArguments",
"required": [
"nid"
],
"properties": {
"nid": {
"type": "string",
"title": "Nid"
},
"prefix": {
"type": "string",
"title": "Prefix",
"default": ""
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}POST /: create a grid, your own space of nodes and scores; no API key needed. Returns its `api_key`, shown only now: pass it as `api_key` to every other tool, or send it as the header `Authorization: Bearer hg-…`. It holds up to `max_nodes` nodes. Each address may create only a few grids a day.
| Argument | Type | Description |
|---|---|---|
| name | string |
{
"type": "object",
"title": "create_gridArguments",
"properties": {
"name": {
"type": "string",
"title": "Name",
"default": "hashgrid"
}
}
}POST /nodes: add a node. An item gets a `key`, a path unique in the grid (e.g. "/items/42"), so searches can find it; a query gets none. `emb` is its embedding, 1 to 2048 floats from any model; use one model per grid. Returns its id and key (not its emb, to keep replies short; get_node has it).
| Argument | Type | Description |
|---|---|---|
| emb* | array | |
| key | any | |
| api_key | any |
{
"type": "object",
"title": "create_nodeArguments",
"required": [
"emb"
],
"properties": {
"emb": {
"type": "array",
"items": {
"type": "number"
},
"title": "Emb"
},
"key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Key",
"default": null
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}DELETE /nodes/{nid}/edges/{eid}: forget a result, so it can be suggested again; its score no longer trains.
| Argument | Type | Description |
|---|---|---|
| eid* | string | |
| nid* | string | |
| api_key | any |
{
"type": "object",
"title": "delete_edgeArguments",
"required": [
"nid",
"eid"
],
"properties": {
"eid": {
"type": "string",
"title": "Eid"
},
"nid": {
"type": "string",
"title": "Nid"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}DELETE /nodes/{nid}: delete a node and every edge from or to it; its scores no longer train.
| Argument | Type | Description |
|---|---|---|
| nid* | string | |
| api_key | any |
{
"type": "object",
"title": "delete_nodeArguments",
"required": [
"nid"
],
"properties": {
"nid": {
"type": "string",
"title": "Nid"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}GET /nodes/{nid}/edges/{eid}: one result of query `nid`, and its score (null if not scored).
| Argument | Type | Description |
|---|---|---|
| eid* | string | |
| nid* | string | |
| api_key | any |
{
"type": "object",
"title": "get_edgeArguments",
"required": [
"nid",
"eid"
],
"properties": {
"eid": {
"type": "string",
"title": "Eid"
},
"nid": {
"type": "string",
"title": "Nid"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}GET /: the grid the API key opens: its name, and the most nodes it holds, `max_nodes` (null: no limit).
| Argument | Type | Description |
|---|---|---|
| api_key | any |
{
"type": "object",
"title": "get_gridArguments",
"properties": {
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}GET /nodes/{nid}: a node, with its key (null if it has none) and its embedding `emb`.
| Argument | Type | Description |
|---|---|---|
| nid* | string | |
| api_key | any |
{
"type": "object",
"title": "get_nodeArguments",
"required": [
"nid"
],
"properties": {
"nid": {
"type": "string",
"title": "Nid"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}GET /nodes/{nid}/edges: a query's results so far, each an edge with the found node's `id` and its `score` (null if not scored), in id order. `limit` is 1 to 1024; for the next page, pass the last id as `cursor`.
| Argument | Type | Description |
|---|---|---|
| nid* | string | |
| limit | integer | |
| cursor | any | |
| api_key | any |
{
"type": "object",
"title": "list_edgesArguments",
"required": [
"nid"
],
"properties": {
"nid": {
"type": "string",
"title": "Nid"
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 32
},
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cursor",
"default": null
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}GET /nodes: the grid's nodes, each with its id, key and emb, in id order. `limit` is 1 to 1024; for the next page, pass the last id as `cursor`.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| cursor | any | |
| api_key | any |
{
"type": "object",
"title": "list_nodesArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 32
},
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cursor",
"default": null
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}PUT /nodes/{nid}/edges/{eid}: score how well node `eid` fits query `nid`, from -1 (wrong) to 1 (perfect), creating the edge if DNA never suggested it, e.g. scores you already have. Only scores train DNA; a new score replaces the last.
| Argument | Type | Description |
|---|---|---|
| eid* | string | |
| nid* | string | |
| score* | number | |
| api_key | any |
{
"type": "object",
"title": "put_edgeArguments",
"required": [
"nid",
"eid",
"score"
],
"properties": {
"eid": {
"type": "string",
"title": "Eid"
},
"nid": {
"type": "string",
"title": "Nid"
},
"score": {
"type": "number",
"title": "Score"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}PATCH /nodes/{nid}/edges/{eid}: score a result of query `nid` that create_edge returned, from -1 (wrong) to 1 (perfect). Only scores train DNA; a new score replaces the last.
| Argument | Type | Description |
|---|---|---|
| eid* | string | |
| nid* | string | |
| score* | number | |
| api_key | any |
{
"type": "object",
"title": "update_edgeArguments",
"required": [
"nid",
"eid",
"score"
],
"properties": {
"eid": {
"type": "string",
"title": "Eid"
},
"nid": {
"type": "string",
"title": "Nid"
},
"score": {
"type": "number",
"title": "Score"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}PATCH /nodes/{nid}: change a node. `key`: a new path, or null to remove it, so the node can no longer be found; leave it out to keep it. `emb`: a new embedding; leave it out to keep it. Its scores keep training, on the new embedding. Returns its id and key.
| Argument | Type | Description |
|---|---|---|
| emb | any | |
| key | any | |
| nid* | string | |
| api_key | any |
{
"type": "object",
"title": "update_nodeArguments",
"required": [
"nid"
],
"properties": {
"emb": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Emb",
"default": null
},
"key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Key",
"default": ""
},
"nid": {
"type": "string",
"title": "Nid"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key",
"default": null
}
}
}