← claude-faf-mcp

claude-faf-mcp 5.22.1

npm · claude-faf-mcp · current release

12
Tools
3
Resources
0
Templates
2
Prompts

Observation

Observed 2026-08-21T16:43:55.411Z using mcpSecurity-inventory. Status: succeeded. Negotiated protocol: 2025-06-18.

Server capabilities
{
  "resources": {
    "listChanged": true
  },
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "listChanged": false
  }
}

Tools 12

ToolCategoryAnnotationsRisk
faf_aboutExplain what the FAF format is — project DNA for AI — with its IANA registration, version, and connected platforms. Returns format metadata and the available MCP bridges. Use this when someone asks what FAF is or how it connects to other AI tools.
Input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
Annotations
{
  "title": "About FAF",
  "readOnlyHint": true,
  "destructiveHint": false,
  "openWorldHint": false
}
Read only · Non-destructive
faf_autoScan your manifests (package.json, Cargo.toml, pyproject.toml, go.mod…) and fill the project.faf stack slots from real dependencies — no hardcoded defaults. Returns what was detected and the updated score. Use this for the technical context; use faf_go for the human 6Ws it can't detect,
Input schema
{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Project path. Sets session context for subsequent calls."
    },
    "force": {
      "type": "boolean",
      "description": "Force overwrite existing files"
    }
  },
  "additionalProperties": false
}
Annotations
{
  "title": "Auto-detect Context",
  "readOnlyHint": false,
  "destructiveHint": false,
  "openWorldHint": false
}
Writes · Non-destructive
faf_benchProve the .faf earns its place — measure how much the context is worth, on THIS repo, falsifiably. Questions derive from the project.faf's own populated slots (the .faf is the answer key), so grading is mechanical — no judge, no rubric. action=questions returns the answer-key-safe question set; action=grade takes your answers WITHOUT the .faf (cold) and WITH it (faf), grades both, and returns the cold→with-faf lift with a ✪ receipt. The delta is the product; the cold number belongs to the absence of context, never to FAF.
Input schema
{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Project path (optional — current directory if omitted)."
    },
    "action": {
      "type": "string",
      "enum": [
        "questions",
        "grade"
      ],
      "description": "questions = get the answer-key-safe question set to answer; grade = submit cold + with-faf answers to score the delta. Default: questions."
    },
    "cold": {
      "type": "object",
      "description": "action=grade: answers produced WITHOUT the .faf (general repo knowledge only). Map of question number → answer string.",
      "additionalProperties": {
        "type": "string"
      }
    },
    "faf": {
      "type": "object",
      "description": "action=grade: answers produced WITH the project.faf in context. Map of question number → answer string.",
      "additionalProperties": {
        "type": "string"
      }
    },
    "coldTokens": {
      "type": "number",
      "description": "action=grade (optional): tokens spent answering cold."
    },
    "fafTokens": {
      "type": "number",
      "description": "action=grade (optional): tokens spent answering with the .faf."
    },
    "model": {
      "type": "string",
      "description": "action=grade (optional): the model that produced the answers."
    }
  },
  "additionalProperties": false
}
Output schema
{
  "type": "object",
  "description": "Question set (action=questions) or the cold→with-faf grading + ✪ receipt (action=grade).",
  "properties": {
    "action": {
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "qsetHash": {
      "type": "string",
      "description": "Hash of the question set — rides the receipt; same .faf reproduces it."
    },
    "protocol": {
      "type": "string",
      "description": "in-session — answers are self-reported by the agent under test."
    },
    "total": {
      "type": "number",
      "description": "Number of questions in the set."
    },
    "questions": {
      "type": "array",
      "description": "action=questions only — NEVER includes the answer key.",
      "items": {
        "type": "object",
        "properties": {
          "n": {
            "type": "number"
          },
          "path": {
            "type": "string",
            "description": "The .faf slot this question probes."
          },
          "question": {
            "type": "string"
          }
        }
      }
    },
    "cold": {
      "type": "object",
      "description": "action=grade — score WITHOUT context (absence baseline).",
      "properties": {
        "correct": {
          "type": "number"
        },
        "total": {
          "type": "number"
        },
        "misses": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Slots missed (paths only — no answer key)."
        }
      }
    },
    "faf": {
      "type": "object",
      "description": "action=grade — score WITH the .faf.",
      "properties": {
        "correct": {
          "type": "number"
        },
        "total": {
          "type": "number"
        },
        "misses": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "delta": {
      "type": "number",
      "description": "with-faf minus cold — the product."
    },
    "receipt": {
      "type": "object",
      "description": "✪ receipt — sha256 over the canonical projection; third-party verifiable.",
      "properties": {
        "projection": {
          "type": "string"
        },
        "hash": {
          "type": "string"
        }
      }
    }
  }
}
Annotations
{
  "title": "AI-Grounding Benchmark",
  "readOnlyHint": true,
  "destructiveHint": false,
  "openWorldHint": false
}
Read only · Non-destructive
faf_contextSet or show the active project path that subsequent faf_ calls resolve against. Returns the current context path. Call this once at the start of a session so the other tools target the right project.
Input schema
{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Set active project path. If omitted, shows current context."
    }
  },
  "additionalProperties": false
}
Output schema
{
  "type": "object",
  "description": "The active project context and whether a project.faf lives there.",
  "properties": {
    "active": {
      "type": "string",
      "description": "Absolute path of the active project"
    },
    "hasFaf": {
      "type": "boolean",
      "description": "Whether a project.faf (or .faf) was found there"
    },
    "filename": {
      "type": [
        "string",
        "null"
      ],
      "description": "The .faf filename, if found"
    },
    "changed": {
      "type": "boolean",
      "description": "True if this call set a new context, false if it only reported"
    }
  },
  "required": [
    "active",
    "hasFaf",
    "changed"
  ],
  "additionalProperties": true
}
Annotations
{
  "title": "View Context",
  "readOnlyHint": true,
  "destructiveHint": false,
  "openWorldHint": false
}
Read only · Non-destructive
faf_doctorDiagnose a project.faf: report empty or weak slots, common issues, and how to fix each. Returns a prioritized checklist. Use this when faf_score is below target and you need to know why.
Input schema
{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Project path. Sets session context for subsequent calls."
    }
  },
  "additionalProperties": false
}
Output schema
{
  "type": "object",
  "description": "Health check: an overall verdict plus per-check diagnostics with fixes.",
  "properties": {
    "health": {
      "type": "string",
      "description": "Overall verdict: ok | warning | error"
    },
    "checks": {
      "type": "number",
      "description": "Number of checks run"
    },
    "errors": {
      "type": "number",
      "description": "Count of error-level findings"
    },
    "warnings": {
      "type": "number",
      "description": "Count of warning-level findings"
    },
    "diagnostics": {
      "type": "array",
      "description": "Per-check results",
      "items": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "ok | warning | error"
          },
          "message": {
            "type": "string"
          },
          "fix": {
            "type": "string",
            "description": "Suggested fix, if any"
          }
        },
        "required": [
          "status",
          "message"
        ]
      }
    }
  },
  "required": [
    "health",
    "checks",
    "diagnostics"
  ],
  "additionalProperties": true
}
Annotations
{
  "title": "Diagnose Issues",
  "readOnlyHint": true,
  "destructiveHint": false,
  "openWorldHint": false
}
Read only · Non-destructive
faf_etchRemember a decision, gotcha, or win across sessions by writing it to the project soul (.fafm). Returns the stored memory's id. Use this to persist something an AI should recall later; use faf_recall to read them back.
Input schema
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "The memory to remember — capture the why (decision/gotcha/win)"
    },
    "id": {
      "type": "string",
      "description": "Stable id — re-etching the same id updates in place (dedup)"
    },
    "type": {
      "type": "string",
      "enum": [
        "project",
        "reference",
        "user",
        "feedback"
      ],
      "description": "Memory category"
    },
    "priority": {
      "type": "string",
      "enum": [
        "ephemeral",
        "standard",
        "high",
        "critical"
      ],
      "description": "Recall ranks by priority then recency"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tags (e.g. decision, gotcha, win) for filtering + recall coupling"
    },
    "path": {
      "type": "string",
      "description": "Project path. Sets session context for subsequent calls."
    }
  },
  "required": [
    "text"
  ],
  "additionalProperties": false
}
Output schema
{
  "type": "object",
  "description": "The etched fact + soul state.",
  "properties": {
    "etched": {
      "type": "object",
      "properties": {
        "text": {
          "type": "string"
        },
        "id": {
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "type": [
            "string",
            "null"
          ]
        },
        "priority": {
          "type": "string"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "timestamp": {
          "type": "string"
        }
      }
    },
    "soul": {
      "type": "string",
      "description": "Path to soul.fafm"
    },
    "total": {
      "type": "number",
      "description": "Total memories in the soul"
    },
    "namepoint": {
      "type": "string"
    }
  },
  "required": [
    "etched",
    "soul"
  ],
  "additionalProperties": true
}
Annotations
{
  "title": "Etch Memory",
  "readOnlyHint": false,
  "destructiveHint": false,
  "openWorldHint": false
}
Writes · Non-destructive
faf_goThe friendly front door — "let's go, tell me about your idea." Asks the human the 6Ws (goal, why, who, what, where, when) that can't be auto-detected, then applies them to project.faf. If no project.faf exists yet, faf_go bootstraps it first (creates it, sources the stack) so you go from nothing to the 6Ws in one step. Returns the Table-of-8 to confirm/answer, or applies the answers you pass back. Use faf_auto for the technical stack on its own.
Input schema
{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Project path. Sets session context for subsequent calls."
    },
    "answers": {
      "type": "object",
      "description": "Answers to apply. Keys are field paths (e.g., \"project.goal\", \"human_context.why\"), values are the answers. If provided, applies answers and returns new score.",
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
Annotations
{
  "title": "Guided Setup",
  "readOnlyHint": false,
  "destructiveHint": false,
  "openWorldHint": false
}
Writes · Non-destructive
faf_initCreate a new project.faf with a name, goal, and language. Returns the file path and starting score. Won't overwrite an existing file — use faf_auto to fill the stack from your manifests, or faf_go for the human 6Ws.
Input schema
{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Project path or name. Smart resolution: \"my-app\" finds ~/Projects/my-app OR ~/Code/my-app. Full paths like ~/Projects/app or /Users/me/code/app work too. Omit to use current directory."
    },
    "force": {
      "type": "boolean",
      "description": "Overwrite existing project.faf if it exists"
    }
  },
  "additionalProperties": false
}
Annotations
{
  "title": "Initialize .faf",
  "readOnlyHint": false,
  "destructiveHint": false,
  "openWorldHint": false
}
Writes · Non-destructive
faf_recallRecall memories from the project soul (.fafm), ranked by priority then recency, filtered by query/tags/type. Returns the matching entries. Use this to surface past decisions; use faf_etch to add new ones.
Input schema
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Case-insensitive substring match on memory text (optional)"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Filter by tag intersection"
    },
    "type": {
      "type": "string",
      "description": "Filter by memory type"
    },
    "minPriority": {
      "type": "string",
      "enum": [
        "ephemeral",
        "standard",
        "high",
        "critical"
      ],
      "description": "Priority floor (default ephemeral)"
    },
    "limit": {
      "type": "number",
      "description": "Max memories to return"
    },
    "path": {
      "type": "string",
      "description": "Project path. Sets session context for subsequent calls."
    }
  },
  "additionalProperties": false
}
Output schema
{
  "type": "object",
  "description": "Ranked memories from the soul.",
  "properties": {
    "memories": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          },
          "id": {
            "type": [
              "string",
              "null"
            ]
          },
          "type": {
            "type": [
              "string",
              "null"
            ]
          },
          "priority": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "timestamp": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "total": {
      "type": "number",
      "description": "Number returned"
    },
    "soulTotal": {
      "type": "number",
      "description": "Total memories in the soul"
    },
    "soul": {
      "type": "string"
    }
  },
  "required": [
    "memories",
    "total"
  ],
  "additionalProperties": true
}
Annotations
{
  "title": "Recall Memory",
  "readOnlyHint": true,
  "destructiveHint": false,
  "openWorldHint": false
}
Read only · Non-destructive
faf_scoreScore a project.faf and return its 0–100% AI-readability, tier, and per-slot breakdown, via the deterministic Mk4 engine. Use this for a quick status check; use faf_doctor when you need to diagnose and fix what's missing.
Input schema
{
  "type": "object",
  "properties": {
    "details": {
      "type": "boolean",
      "description": "Include detailed breakdown and improvement suggestions"
    },
    "path": {
      "type": "string",
      "description": "Project path. Sets session context for subsequent calls."
    }
  },
  "additionalProperties": false
}
Output schema
{
  "type": "object",
  "description": "Structured AI-readiness score, single-sourced from faf-cli.",
  "properties": {
    "score": {
      "type": "number",
      "description": "AI-readiness score, 0-100"
    },
    "tier": {
      "type": "string",
      "description": "Tier name for this score (e.g. Bronze, Trophy)"
    },
    "populated": {
      "type": "number",
      "description": "Active slots that are filled"
    },
    "empty": {
      "type": "number",
      "description": "Active slots still empty"
    },
    "ignored": {
      "type": "number",
      "description": "Slots marked slotignored (inactive for this app_type)"
    },
    "active": {
      "type": "number",
      "description": "Slots active for this app_type"
    },
    "total": {
      "type": "number",
      "description": "Total slots"
    },
    "nextTier": {
      "type": [
        "object",
        "null"
      ],
      "description": "Next tier above the current score, or null at top tier",
      "properties": {
        "name": {
          "type": "string"
        },
        "threshold": {
          "type": "number"
        }
      }
    },
    "inherited": {
      "type": "boolean",
      "description": "True if the score is attested from a source repo (app_type: about)"
    },
    "hasFaf": {
      "type": "boolean",
      "description": "Whether a readable, valid project.faf was scored"
    },
    "path": {
      "type": "string",
      "description": "Path that was scored"
    },
    "parity": {
      "type": "object",
      "description": "Determinism parity receipt — an engine-agnostic hash any conformant scorer reproduces for this exact file. Third-party verifiable: sha256(projection) === parityHash.",
      "properties": {
        "spec": {
          "type": "string",
          "description": "Parity spec id, e.g. faf-parity/v1"
        },
        "algo": {
          "type": "string",
          "description": "Hash algorithm (sha256)"
        },
        "scorer": {
          "type": "string",
          "description": "The single deterministic source the score comes from"
        },
        "producedBy": {
          "type": "string",
          "description": "Which wrapper emitted this receipt (metadata, not hashed)"
        },
        "sourceSha256": {
          "type": "string",
          "description": "SHA-256 of the raw .faf bytes"
        },
        "parityHash": {
          "type": "string",
          "description": "sha256(projection) — identical across any conformant engine"
        },
        "projection": {
          "type": "string",
          "description": "The exact canonical string that was hashed (for verification)"
        }
      },
      "required": [
        "spec",
        "parityHash",
        "sourceSha256",
        "projection"
      ]
    }
  },
  "required": [
    "score",
    "tier",
    "hasFaf"
  ],
  "additionalProperties": true
}
Annotations
{
  "title": "AI-Readiness Score",
  "readOnlyHint": true,
  "destructiveHint": false,
  "openWorldHint": false
}
Read only · Non-destructive
faf_syncSync project.faf into CLAUDE.md as a faf-managed block, and optionally into AGENTS.md (agents), .cursorrules (cursor), GEMINI.md (gemini), and .github/copilot-instructions.md (copilot) — or all of them (all). Updates each block in place — it never overwrites your file. Use this after editing project.faf so every AI tool sees the latest context.
Input schema
{
  "type": "object",
  "properties": {
    "agents": {
      "type": "boolean",
      "description": "Also sync to AGENTS.md (OpenAI/Codex format)"
    },
    "cursor": {
      "type": "boolean",
      "description": "Also sync to .cursorrules (Cursor IDE format)"
    },
    "gemini": {
      "type": "boolean",
      "description": "Also sync to GEMINI.md (Google Gemini format)"
    },
    "copilot": {
      "type": "boolean",
      "description": "Also sync to .github/copilot-instructions.md (GitHub Copilot)"
    },
    "all": {
      "type": "boolean",
      "description": "Sync to ALL formats: CLAUDE.md + AGENTS.md + .cursorrules + GEMINI.md + .github/copilot-instructions.md"
    },
    "path": {
      "type": "string",
      "description": "Project path. Sets session context for subsequent calls."
    }
  },
  "additionalProperties": false
}
Annotations
{
  "title": "Sync .faf to CLAUDE.md (+ any AI format)",
  "readOnlyHint": false,
  "destructiveHint": false,
  "openWorldHint": false
}
Writes · Non-destructive
faf_trustAttest a project.faf's integrity: its validity, score, and a deterministic parity hash any conformant engine reproduces. Returns the ✪ receipt. Use this to prove a score is genuine and untampered.
Input schema
{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Project path. Sets session context for subsequent calls."
    }
  },
  "additionalProperties": false
}
Output schema
{
  "type": "object",
  "description": "Trust attestation: validity, score, and a third-party-verifiable determinism parity receipt.",
  "properties": {
    "valid": {
      "type": "boolean",
      "description": "Whether the project.faf is readable and valid"
    },
    "hasFaf": {
      "type": "boolean",
      "description": "Whether a project.faf was found"
    },
    "score": {
      "type": "number",
      "description": "AI-readiness score, 0-100"
    },
    "tier": {
      "type": "string",
      "description": "Tier name for this score"
    },
    "path": {
      "type": "string",
      "description": "Path that was attested"
    },
    "sourceSha256": {
      "type": "string",
      "description": "SHA-256 of the raw .faf bytes"
    },
    "reason": {
      "type": "string",
      "description": "Why validation failed, when valid is false"
    },
    "parity": {
      "type": "object",
      "description": "Determinism parity receipt (same shape as faf_score.parity).",
      "properties": {
        "spec": {
          "type": "string"
        },
        "algo": {
          "type": "string"
        },
        "scorer": {
          "type": "string"
        },
        "producedBy": {
          "type": "string"
        },
        "sourceSha256": {
          "type": "string"
        },
        "parityHash": {
          "type": "string"
        },
        "projection": {
          "type": "string"
        }
      },
      "required": [
        "spec",
        "parityHash",
        "sourceSha256",
        "projection"
      ]
    },
    "receipt": {
      "type": "object",
      "description": "The ✪ trust receipt — render-identical, self-verifying score+parity artifact.",
      "properties": {
        "spec": {
          "type": "string"
        },
        "seal": {
          "type": "string",
          "description": "Quiet-ladder glyph for this score (✪ at Trophy)"
        },
        "subject": {
          "type": "string"
        },
        "score": {
          "type": "number"
        },
        "tier": {
          "type": "string"
        },
        "tests": {
          "type": [
            "object",
            "null"
          ],
          "description": "Optional test attestation"
        },
        "issued": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "spec",
        "seal",
        "subject",
        "score"
      ]
    }
  },
  "required": [
    "valid",
    "hasFaf"
  ],
  "additionalProperties": true
}
Annotations
{
  "title": "Trust Attestation",
  "readOnlyHint": true,
  "destructiveHint": false,
  "openWorldHint": false
}
Read only · Non-destructive

Resources 3

Resource templates 0

Prompts 2

Let’s talk about MCP security.

Share your details and our security team will contact you.