@index365/mcp
Advanced tools
+1
-1
| { | ||
| "name": "@index365/mcp", | ||
| "version": "0.1.3", | ||
| "version": "0.1.4", | ||
| "description": "index365 MCP server (stdio) for AI-Readiness and Marketing Signal scans plus read-only access to runs and findings. No Website Security scan tool.", | ||
@@ -5,0 +5,0 @@ "mcpName": "io.github.index365usa/index365", |
+3
-1
@@ -35,4 +35,6 @@ # @index365/mcp | ||
| Read: `list_projects`, `get_run_status`, `list_findings`, `get_finding`, `get_report_context`, `get_marketing_signal_report`, `list_integrations`, `list_connected_signals`. Run: `start_audit`, `run_marketing_signal_audit`. | ||
| Read: `list_projects`, `get_run_status`, `list_findings`, `get_finding`, `get_report_context`, `get_marketing_signal_report`, `list_integrations`, `list_connected_signals`. Run: `start_audit`, `run_marketing_signal_audit`. Projects: `create_project`, `archive_project`, and `restore_project`. | ||
| `archive_project` reversibly removes a project from active lists while preserving its history and keys. `restore_project` reactivates it. The local stdio server retains `delete_project` only as a deprecated compatibility alias for `archive_project`; the hosted server omits that alias and exposes the truthful archive and restore names. `list_projects` accepts `status=active|paused|archived|all` and excludes archived projects when status is omitted. | ||
| Prompts: `triage_findings`, `prepare_pr_plan`, `marketing_fix_plan`, `summarize_run_for_slack`. | ||
@@ -39,0 +41,0 @@ |
@@ -23,2 +23,4 @@ /** Type declarations for the tool handler logic (handlers.mjs). */ | ||
| | "create_project" | ||
| | "archive_project" | ||
| | "restore_project" | ||
| | "delete_project"; | ||
@@ -25,0 +27,0 @@ |
+20
-4
@@ -36,2 +36,14 @@ import { ApiError, apiGet, apiRequest } from "./api.mjs"; | ||
| export function buildHandlers(settings, fetchImpl = fetch) { | ||
| const archiveProject = async (args) => { | ||
| try { | ||
| const data = await apiRequest(settings, "DELETE", `/api/v1/projects/${args.projectId}`, { | ||
| query: { confirm: args.confirmDomain }, | ||
| fetchImpl, | ||
| }); | ||
| return ok(data); | ||
| } catch (err) { | ||
| return fail(err); | ||
| } | ||
| }; | ||
| return { | ||
@@ -43,3 +55,3 @@ async list_projects(args) { | ||
| "/api/v1/projects", | ||
| { limit: clampLimit(args.limit), cursor: args.cursor }, | ||
| { limit: clampLimit(args.limit), cursor: args.cursor, status: args.status }, | ||
| fetchImpl, | ||
@@ -200,6 +212,8 @@ ); | ||
| async delete_project(args) { | ||
| archive_project: archiveProject, | ||
| async restore_project(args) { | ||
| try { | ||
| const data = await apiRequest(settings, "DELETE", `/api/v1/projects/${args.projectId}`, { | ||
| query: { confirm: args.confirmDomain }, | ||
| const data = await apiRequest(settings, "PATCH", `/api/v1/projects/${args.projectId}`, { | ||
| body: { status: "active" }, | ||
| fetchImpl, | ||
@@ -212,2 +226,4 @@ }); | ||
| }, | ||
| delete_project: archiveProject, | ||
| }; | ||
@@ -214,0 +230,0 @@ } |
@@ -13,3 +13,3 @@ /** Type declarations for the shared MCP tool/prompt registry (register.mjs). */ | ||
| * @param getHandlers resolves the per-call handler map (carries the API key). | ||
| * @param opts.omitTools tool names NOT to mount (remote launch omits delete_project). | ||
| * @param opts.omitTools tool names NOT to mount (remote launch omits the deprecated delete_project alias). | ||
| */ | ||
@@ -16,0 +16,0 @@ export function registerIndex365Tools( |
+55
-9
@@ -29,3 +29,3 @@ import { z } from "zod"; | ||
| "list_integrations / list_connected_signals describe the connected-source layer; providers report planned until hosted connections launch.", | ||
| "Project management: create_project adds a domain-anchored project (idempotent by domain); delete_project removes one and REQUIRES confirmDomain set to the project's exact domain. These need the projects:write / projects:delete scopes.", | ||
| "Project management: create_project adds or restores a domain-anchored project; archive_project reversibly hides one and REQUIRES the exact confirmDomain; restore_project reactivates it. delete_project is a deprecated local compatibility alias for archive_project.", | ||
| "All access is scoped to the API key's organization. start_audit and run_marketing_signal_audit spend org credits and need the runs:write scope.", | ||
@@ -74,3 +74,3 @@ ].join(" "); | ||
| description: | ||
| "List the organization's projects (domain-anchored workspaces). Best for: resolving the projectId for start_audit, or seeing which sites exist. Not for: per-project detail (the row already carries it). Paginated: pass cursor from the previous page (default 20, max 50). Common mistake: re-listing every turn instead of caching the projectId you resolved.", | ||
| "List the organization's projects (domain-anchored workspaces). Omitted status excludes archived projects; pass active, paused, archived, or all for an exact lifecycle view. Best for: resolving a projectId or finding an archived project to restore. Paginated: pass cursor from the previous page (default 20, max 50).", | ||
| inputSchema: { | ||
@@ -85,2 +85,6 @@ limit: z | ||
| cursor: z.string().optional().describe("pagination.nextCursor from the previous page"), | ||
| status: z | ||
| .enum(["active", "paused", "archived", "all"]) | ||
| .optional() | ||
| .describe("Lifecycle filter. Omit to exclude archived projects."), | ||
| }, | ||
@@ -232,13 +236,55 @@ }, | ||
| { | ||
| name: "archive_project", | ||
| config: { | ||
| title: "Archive a project", | ||
| annotations: { | ||
| readOnlyHint: false, | ||
| destructiveHint: true, | ||
| idempotentHint: true, | ||
| openWorldHint: true, | ||
| }, | ||
| description: | ||
| "Reversibly archive a project so it leaves active lists and cannot start new runs. Scan history and API keys remain available, and restore_project reactivates the same row. Requires projects:delete. Read first, then pass confirmDomain set to the project's exact domain. Safe to retry.", | ||
| inputSchema: { | ||
| projectId: z.string().uuid().describe("Project id to archive (from list_projects)"), | ||
| confirmDomain: z | ||
| .string() | ||
| .describe("The project's exact domain, echoed to authorize the archive"), | ||
| }, | ||
| }, | ||
| }, | ||
| { | ||
| name: "restore_project", | ||
| config: { | ||
| title: "Restore a project", | ||
| annotations: { | ||
| readOnlyHint: false, | ||
| destructiveHint: false, | ||
| idempotentHint: true, | ||
| openWorldHint: true, | ||
| }, | ||
| description: | ||
| "Restore an archived project to active status without changing its id, history, or keys. Requires projects:write. Find archived ids with list_projects status=archived. Safe to retry; an active project remains active.", | ||
| inputSchema: { | ||
| projectId: z.string().uuid().describe("Archived project id to restore"), | ||
| }, | ||
| }, | ||
| }, | ||
| { | ||
| name: "delete_project", | ||
| config: { | ||
| title: "Delete a project", | ||
| annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true }, | ||
| title: "Archive a project (legacy alias)", | ||
| annotations: { | ||
| readOnlyHint: false, | ||
| destructiveHint: true, | ||
| idempotentHint: true, | ||
| openWorldHint: true, | ||
| }, | ||
| description: | ||
| "Permanently delete a project and its data (api keys, monitored assets, and monitoring events cascade; run history is preserved). Requires the projects:delete scope. Irreversible. Read-before-destroy: you MUST pass confirmDomain set to the project's exact domain (get it from list_projects first), or the call is rejected. Common mistake: deleting on a guessed projectId without confirming the domain.", | ||
| "Deprecated compatibility alias for archive_project. It reversibly archives the project, preserves its history and keys, and can be undone with restore_project. Requires projects:delete. Read first, then pass confirmDomain set to the project's exact domain. New clients should call archive_project.", | ||
| inputSchema: { | ||
| projectId: z.string().uuid().describe("Project id to delete (from list_projects)"), | ||
| projectId: z.string().uuid().describe("Project id to archive (from list_projects)"), | ||
| confirmDomain: z | ||
| .string() | ||
| .describe("The project's exact domain, echoed to authorize the delete"), | ||
| .describe("The project's exact domain, echoed to authorize the archive"), | ||
| }, | ||
@@ -264,4 +310,4 @@ }, | ||
| // Fail loud on a typo in the omit list: a misspelled name would otherwise | ||
| // silently MOUNT a tool meant to be omitted (e.g. the destructive delete_project | ||
| // on the public remote surface). | ||
| // mount a tool meant to be omitted, such as the deprecated delete_project | ||
| // compatibility alias on the public remote surface. | ||
| const unknownOmissions = (opts.omitTools ?? []).filter((name) => !TOOL_NAMES.includes(name)); | ||
@@ -268,0 +314,0 @@ if (unknownOmissions.length) { |
+2
-2
@@ -35,4 +35,4 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; | ||
| // stdio mounts the FULL registry (all 12 tools incl. delete_project). The | ||
| // remote route omits delete_project for its public launch via opts.omitTools. | ||
| // stdio mounts the full 14-tool registry, including the deprecated | ||
| // delete_project alias. The remote route omits only that alias. | ||
| registerIndex365Tools(server, () => handlers); | ||
@@ -39,0 +39,0 @@ |
+1
-1
@@ -1,1 +0,1 @@ | ||
| export const SERVER_VERSION = "0.1.3"; | ||
| export const SERVER_VERSION = "0.1.4"; |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
38643
6.42%743
8.63%48
4.35%