Appearance
Projects
Resolve a project before any tool that takes project_id. If the user names a project or a nickname, call search_projects first. If resolved is set, use that id. If several matches come back, ask which name. Never pass a name as project_id.
List Projects
list_projects · intangia:read
No arguments. Returns { "projects": [...] } for projects the user belongs to, including role and the latest brief. Same rows as List Projects.
Search Projects
search_projects · intangia:read
| Argument | Notes |
|---|---|
q | Name, partial name, or nickname. Pass the words the user used. |
limit | Optional. Default 5, maximum 8. |
json
{
"query": "kinase",
"resolved": { "id": "2c0b1a44-7e1d-4f0a-9c3b-6d5e4f3a2b10", "name": "Kinase landscape" },
"total": 1,
"matches": [
{
"id": "2c0b1a44-7e1d-4f0a-9c3b-6d5e4f3a2b10",
"name": "Kinase landscape",
"role": "owner",
"matched_on": "name"
}
]
}resolved is set when one project is the clear match. matched_on is name or brief. When resolved is null, ask the user which matches name they mean.
Create a Project
create_project · projects:write
| Argument | Notes |
|---|---|
brief | The user's brief, verbatim. The server extracts scope from it. |
name | Optional. If omitted, the server uses the title it extracted. |
confirmed_terms | Phrases the user explicitly chose after you asked. Not ids, and not phrases they did not confirm. |
Do not call search_keywords first, and do not invent keywords. A blank brief returns Missing brief.
When nothing in the brief matches a scope keyword, or terms remain unmatched, the project is not created (or is created but still needs a choice):
json
{
"created": false,
"needs_confirmation": true,
"name": "Kinase landscape",
"goals": ["target"],
"scope": { "keywords": [], "organizations": [] },
"unmatched": [{ "term": "example term" }],
"unmatched_organizations": []
}Ask which option to use, then call create_project again with the same brief and those phrases as confirmed_terms.
When at least one scope keyword matches, the project is created and the initial scan starts:
json
{
"created": true,
"needs_confirmation": false,
"id": "2c0b1a44-7e1d-4f0a-9c3b-6d5e4f3a2b10",
"name": "Kinase landscape",
"role": "owner",
"setup_url": "https://app.intangia.co/projects/2c0b1a44-7e1d-4f0a-9c3b-6d5e4f3a2b10/overview?setup=1",
"goals": ["target"],
"scope": { "keywords": [], "organizations": [] },
"unmatched": [],
"unmatched_organizations": []
}If a project id already exists, call update_project for scope changes. Do not send the user to setup_url to pick scope. Once an id exists, call setup_project to configure scoring.
Update a Project
update_project · projects:write
You must be an editor or owner.
| Argument | Notes |
|---|---|
project_id | UUID |
brief | Replacement brief. Does not re-extract scope. |
add_scope_terms | Phrases to add. The server matches them. |
remove_scope_terms | Keyword names to remove, case-insensitive. |
add_organizations | Organisation names to add. The server matches them. |
remove_organizations | Organisation names to remove, case-insensitive. |
At least one change is required. Otherwise the error is Nothing to update. Do not pass keyword ids.
The result includes id, name, brief, setup_url, scope, unmatched, unmatched_organizations, and needs_confirmation. If unmatched terms remain, ask which option to use and call the tool again. A failed scan adds scan_error. The update is still saved.
Set Up Scoring
setup_project · projects:write
You must be an editor or owner. This is the same scoring setup as the project setup dialog. Show the returned question and options. Do not choose answers yourself.
| Argument | Notes |
|---|---|
project_id | UUID |
action | plan, answer, turn, focus, sample, or finish. Default plan. |
question_id | Required for answer and focus. Use question_id from the previous result. |
value | Option value the user chose. Required for answer. |
message | The user's reply in their own words. Required for turn. |
plan starts or resumes the conversation. Pass answer when the reply matches an option value. Otherwise pass turn. sample compiles a draft and does not run the in-app example stream. When complete is true, ask whether to finish, then call finish.
json
{
"status": "active",
"finished": false,
"complete": false,
"question": "Which ranking should scoring use?",
"options": [{ "value": "most_promising", "label": "Most promising" }],
"question_id": "ranking",
"checklist": [{ "id": "ranking", "label": "Ranking", "status": "current", "summary": null }],
"error": null
}Do not send the user to setup_url to do this setup.