Skip to main content
Glama

Create a watched project

create_project

Create a project: a site MeshArc re-crawls on a schedule, comparing each run with the last to record pages added, modified and removed. Use it when asked to monitor or track a site; for a one-off read use crawl_site. Check list_projects first so the site is not added twice. Inputs: seed starts a new project, e.g. 'example.com'. crawl_id instead keeps a crawl_site crawl from the last day as the first run, with no second fetch; it keeps that crawl's settings, so config goes only with seed. The usual config keys are include_paths (one section, e.g. ['/blog/*']), exclude_paths, max_pages and render_js; get_project with no project_id lists them all. Cost: creating reads robots.txt and the sitemaps but no pages, so it is free. Each run spends credits per page, and any schedule but 'manual' runs on its own. Refusals: an unknown config key, or a plan already at its project limit (code plan_limit). Values above the plan's caps are lowered to them. Needs write access; a read-only connection is refused with code 'read_only'.

Input Schema

NameRequiredDescriptionDefault
nameNoA display name; omit for the site's host (or the crawl's own name).
seedNoThe site to watch, as a URL or bare domain, e.g. 'https://example.com/blog/' or 'example.com'; its host is fixed for good. Give this or crawl_id.
configNoSettings as {key: value}, with a seed only; omit for the defaults.
crawl_idNoA crawl_site answer's crawl_id, to keep that crawl as the project. Give this or seed.
scheduleNoHow often it re-crawls on its own; 'manual' (default) runs only when start_run is called.manual

Output Schema

NameRequiredDescriptionDefault
idNoThe project's 32-character hex id.
codeNoOnly on a failure: a machine-readable reason, e.g. read_only, validation, plan_limit or not_found.
hostNoThe site it covers; fixed at creation.
nameNoIts display name.
noteNoNo project_id only: how path globs work.
seedNoWhere its crawls start.
errorNoOnly when the call failed: what went wrong, in words an assistant can act on.
configNoIts settings as {key: value}; secrets such as chat_url come back masked.
detailNoOnly on a failure: the API's own wording, when the error was rephrased.
pagesNNoPages its last finished run read.
statusNodraft, crawling, healthy or failing. On an error, the HTTP status code.
coverageNoPercent of the site the last run reached; under 90 means removals are withheld.
settingsNoNo project_id only: every common setting as {key, meaning, default}.
webhooksNoget_project only: {url, events, deliveries}: where run and change events are POSTed, which events, and the last 10 deliveries, each {id, event, status (queued, retrying, delivered or failed), attempts, lastStatus, lastError, createdAt, deliveredAt}. The signing secret is never included.
lastRunAtNoWhen the last run started (ISO 8601), or null.
nextRunAtNoWhen the schedule runs it next, or null for manual.
retentionNoHow long runs are kept, e.g. '90d'.
schedulesNoNo project_id only: the valid schedules.
other_keysNoNo project_id only: further keys accepted but rarely needed.
scheduleKeyNomanual, hourly, daily or weekly.
webhookTestNoupdate_project with test_webhook only: {queued, id} when a test run.finished message was queued, or {error, status} when the API refused it, e.g. with no webhook URL saved.
changeSummaryNoThe last compared run in words, e.g. '3 new · 2 changed · 0 removed'.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedOutput schema / description
      Previous value: -"A project, or with no project_id the settings any project can take."New value: +"A project, as get_project, create_project and update_project answer with it; get_project with no\nproject_id answers with the settings any project can take instead."
    • addedOutput schema / properties / webhookTest
      Added value: +{
      +  "description": "update_project with test_webhook only: {queued, id} when a test run.finished message was queued, or {error, status} when the API refused it, e.g. with no webhook URL saved.",
      +  "title": "Webhooktest"
      +}
    • addedOutput schema / properties / webhooks
      Added value: +{
      +  "description": "get_project only: {url, events, deliveries}: where run and change events are POSTed, which events, and the last 10 deliveries, each {id, event, status (queued, retrying, delivered or failed), attempts, lastStatus, lastError, createdAt, deliveredAt}. The signing secret is never included.",
      +  "title": "Webhooks"
      +}
  2. Changed9 schema fields changed
    • changedInput schema / properties / config / description
      Previous value: -"Any subset of the settings describe_project_config lists. For one section of a site pass include_paths, e.g. {\"include_paths\": [\"/blog/*\"]}; map_site shows the site's sections first. Omit for the defaults."New value: +"Settings as {key: value}, with a seed only; omit for the defaults."
    • addedInput schema / properties / crawl_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "A crawl_site answer's crawl_id, to keep that crawl as the project. Give this or seed.",
      +  "title": "Crawl Id"
      +}
    • changedInput schema / properties / name / description
      Previous value: -"A name for the project; omit to use the site's host name."New value: +"A display name; omit for the site's host (or the crawl's own name)."
    • addedInput schema / properties / seed / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / seed / default
      Added value: +null
    • changedInput schema / properties / seed / description
      Previous value: -"Where the crawl starts: a public site's URL or bare domain, e.g. 'https://example.com/blog/' or 'example.com'. The project covers that host."New value: +"The site to watch, as a URL or bare domain, e.g. 'https://example.com/blog/' or 'example.com'; its host is fixed for good. Give this or crawl_id."
    • removedInput schema / properties / seed / type
      Removed value: -"string"
    • removedInput schema / required
      Removed value: -[
      -  "seed"
      -]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "description": "A project, or with no project_id the settings any project can take.",
      +  "properties": {
      +    "changeSummary": {
      +      "description": "The last compared run in words, e.g. '3 new · 2 changed · 0 removed'.",
      +      "title": "Changesummary"
      +    },
      +    "code": {
      +      "description": "Only on a failure: a machine-readable reason, e.g. read_only, validation, plan_limit or not_found.",
      +      "title": "Code"
      +    },
      +    "config": {
      +      "description": "Its settings as {key: value}; secrets such as chat_url come back masked.",
      +      "title": "Config"
      +    },
      +    "coverage": {
      +      "description": "Percent of the site the last run reached; under 90 means removals are withheld.",
      +      "title": "Coverage"
      +    },
      +    "detail": {
      +      "description": "Only on a failure: the API's own wording, when the error was rephrased.",
      +      "title": "Detail"
      +    },
      +    "error": {
      +      "description": "Only when the call failed: what went wrong, in words an assistant can act on.",
      +      "title": "Error"
      +    },
      +    "host": {
      +      "description": "The site it covers; fixed at creation.",
      +      "title": "Host"
      +    },
      +    "id": {
      +      "description": "The project's 32-character hex id.",
      +      "title": "Id"
      +    },
      +    "lastRunAt": {
      +      "description": "When the last run started (ISO 8601), or null.",
      +      "title": "Lastrunat"
      +    },
      +    "name": {
      +      "description": "Its display name.",
      +      "title": "Name"
      +    },
      +    "nextRunAt": {
      +      "description": "When the schedule runs it next, or null for manual.",
      +      "title": "Nextrunat"
      +    },
      +    "note": {
      +      "description": "No project_id only: how path globs work.",
      +      "title": "Note"
      +    },
      +    "other_keys": {
      +      "description": "No project_id only: further keys accepted but rarely needed.",
      +      "title": "Other Keys"
      +    },
      +    "pagesN": {
      +      "description": "Pages its last finished run read.",
      +      "title": "Pagesn"
      +    },
      +    "retention": {
      +      "description": "How long runs are kept, e.g. '90d'.",
      +      "title": "Retention"
      +    },
      +    "scheduleKey": {
      +      "description": "manual, hourly, daily or weekly.",
      +      "title": "Schedulekey"
      +    },
      +    "schedules": {
      +      "description": "No project_id only: the valid schedules.",
      +      "title": "Schedules"
      +    },
      +    "seed": {
      +      "description": "Where its crawls start.",
      +      "title": "Seed"
      +    },
      +    "settings": {
      +      "description": "No project_id only: every common setting as {key, meaning, default}.",
      +      "title": "Settings"
      +    },
      +    "status": {
      +      "description": "draft, crawling, healthy or failing. On an error, the HTTP status code.",
      +      "title": "Status"
      +    }
      +  },
      +  "title": "ProjectOut",
      +  "type": "object"
      +}
  3. Changed5 schema fields changed
    • addedInput schema / properties / config / description
      Added value: +"Any subset of the settings describe_project_config lists. For one section of a site pass include_paths, e.g. {\"include_paths\": [\"/blog/*\"]}; map_site shows the site's sections first. Omit for the defaults."
    • addedInput schema / properties / name / description
      Added value: +"A name for the project; omit to use the site's host name."
    • addedInput schema / properties / schedule / description
      Added value: +"How often it re-crawls on its own; 'manual' (default) runs only when start_run is called."
    • addedInput schema / properties / schedule / enum
      Added value: +[
      +  "manual",
      +  "hourly",
      +  "daily",
      +  "weekly"
      +]
    • addedInput schema / properties / seed / description
      Added value: +"Where the crawl starts: a public site's URL or bare domain, e.g. 'https://example.com/blog/' or 'example.com'. The project covers that host."
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations: creation costs nothing because it reads robots.txt/sitemaps but no pages, each run spends credits per page, any non-manual schedule runs autonomously, plan caps silently lower oversized values, and it requires write access (read-only connections refused with 'read_only', over-limit with 'plan_limit'). Annotations only supply the readOnly/destructive/idempotent profile; the cost, refusal, and autonomy behavior is unique to the text.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but front-loaded and cleanly chunked into Purpose/Inputs/Cost/Refusals, with no redundant restatement of the name or title. Some sentences are dense, but each carries distinct information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the gap left by the structured fields: an output schema exists so return values need no explanation, and annotations cover safety, while the description supplies cost model, authorization requirement, refusal codes, and cap-clamping behavior. Nothing needed to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real semantics the schema cannot express: seed vs crawl_id mutual exclusivity and the consequences of each (seed starts fresh and carries config; crawl_id reuses a crawl from the last day with no second fetch and keeps that crawl's settings). It also enumerates the accepted config keys (include_paths, exclude_paths, max_pages, render_js), which the schema leaves as an opaque additionalProperties object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and immediately defines what a project actually is (a site re-crawled on a schedule with diffing), which is non-obvious. It explicitly distinguishes itself from crawl_site (one-off read) and list_projects (dedupe check), so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('monitor or track a site'), when-not-to ('for a one-off read use crawl_site'), and a prerequisite ('Check list_projects first so the site is not added twice'). Alternatives and conditions are named rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.