{
  "slug": "serena",
  "name": "Serena",
  "author": "oraios (GitHub)",
  "category": "Developer tools",
  "tier": "checkable",
  "kind": "stdio",
  "packageSpec": "pypi:serena-agent@2.1.0",
  "sourceUrl": "https://registry.modelcontextprotocol.io/v0/servers/io.github.oraios%2Fserena/versions/latest",
  "repoUrl": "https://github.com/oraios/serena",
  "enrichment": {},
  "current": {
    "verdict": "alive",
    "reason": "all_passed",
    "failedChecks": [],
    "untestedTools": 1,
    "checkedAt": "2026-10-29T06:54:06.898Z",
    "methodologyVersion": "1.0.0",
    "serverVersion": "2.1.0",
    "checks": [
      {
        "id": "L0.reachable",
        "detail": "http undefined",
        "status": "pass",
        "durationMs": 69664
      },
      {
        "id": "L0.tls",
        "status": "skipped"
      },
      {
        "id": "L0.initialize",
        "status": "pass",
        "evidence": {
          "raw": "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"capabilities\":{\"experimental\":{},\"prompts\":{\"listChanged\":false},\"resources\":{\"listChanged\":false,\"subscribe\":false},\"tools\":{\"listChanged\":false}},\"instructions\":\"CRITICAL: Before starting to work on a coding task, call the `initial_instructions` tool to read the 'Serena Instructions Manual'.\",\"protocolVersion\":\"2025-11-25\",\"serverInfo\":{\"name\":\"Serena\",\"version\":\"2.1.0\",\"websiteUrl\":\"https://oraios.github.io/serena\"}}}"
        },
        "durationMs": 69664
      },
      {
        "id": "L0.protocol_version",
        "detail": "server reported \"2025-11-25\"; published versions: 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25",
        "status": "pass"
      },
      {
        "id": "L0.capabilities",
        "detail": "experimental, prompts, resources, tools",
        "status": "pass"
      },
      {
        "id": "L1.server_info",
        "detail": "Serena 2.1.0",
        "status": "pass"
      },
      {
        "id": "L1.tools_list",
        "detail": "3 tools",
        "status": "pass"
      },
      {
        "id": "L1.tool_schemas",
        "detail": "3 schemas valid",
        "status": "pass"
      },
      {
        "id": "L1.resources_list",
        "detail": "0 entries",
        "status": "pass"
      },
      {
        "id": "L1.prompts_list",
        "detail": "0 entries",
        "status": "pass"
      },
      {
        "id": "L1.unknown_method",
        "status": "pass",
        "evidence": {
          "raw": "{\"jsonrpc\":\"2.0\",\"id\":5,\"error\":{\"code\":-32601,\"message\":\"Method not found\",\"data\":\"knot/verified-probe-unknown-method\"}}"
        },
        "durationMs": 8
      },
      {
        "id": "L1.envelope",
        "detail": "5 replies valid",
        "status": "pass"
      },
      {
        "id": "L2.call_ok",
        "tool": "activate_project",
        "status": "pass",
        "evidence": {
          "raw": "{\"jsonrpc\":\"2.0\",\"id\":6,\"result\":{\"content\":[{\"text\":\"Error executing tool activate_project: ProjectNotFoundError: Project 'knot-verified-probe' not found: Not a valid project name or directory. Existing project names: []\",\"type\":\"text\"}],\"isError\":true}}",
          "arguments": {
            "project": "knot-verified-probe",
            "session": "knot-verified-probe"
          }
        },
        "durationMs": 73
      },
      {
        "id": "L2.output_schema",
        "tool": "activate_project",
        "detail": "tool reported isError",
        "status": "skipped"
      },
      {
        "id": "L2.bad_input",
        "tool": "activate_project",
        "status": "pass",
        "evidence": {
          "raw": "{\"jsonrpc\":\"2.0\",\"id\":7,\"result\":{\"content\":[{\"text\":\"Error executing tool activate_project: 2 validation errors for applyArguments\\nproject\\n  Field required [type=missing, input_value={}, input_type=dict]\\n    For further information visit https://errors.pydantic.dev/2.12/v/missing\\nsession\\n  Field required [type=missing, input_value={}, input_type=dict]\\n    For further information visit https://errors.pydantic.dev/2.12/v/missing\",\"type\":\"text\"}],\"isError\":true}}",
          "arguments": {}
        },
        "durationMs": 16
      },
      {
        "id": "L2.call_ok",
        "tool": "initial_instructions",
        "status": "pass",
        "evidence": {
          "raw": "{\"jsonrpc\":\"2.0\",\"id\":8,\"result\":{\"content\":[{\"text\":\"<serena>\\nYou have semantic coding functions/tools that you rely on heavily. Work resource-efficiently: don't read or\\ngenerate content the task doesn't need.\\n\\nSome tasks require understanding a large part of the codebase; others need only a few symbols or a\\nsingle file. Avoid reading whole files unless necessary — acquire information step by step, using\\nthe symbolic functions to get an overview of symbols and their relations, then reading only the bodies\\nyou need. Once you have read a full file, there is no point re-analysing it with the symbolic read\\ntools — you already have it. \\n\\nFor searches beyond named symbols, you can use `fs.search_for_pattern` and flexible search for patterns in the codebase. In this way, you can first find candidates for symbols or files to explore,\\nand then proceed with symbolic operations.\\n\\n\\n\\nSymbols are identified by their `name_path` and `relative_path`.\\nYou can get an overview of the symbols in a file by using `lsp.get_symbols_overview`, or search for a specific symbol with `lsp.find_symbol`.\\nYou only read the bodies of symbols when you need to (e.g. if you want to fully understand or edit it).\\nFor example, if you are working with Python code and already know that you need to read the body of the constructor of the class Foo, you can directly\\nuse `lsp.find_symbol` with name path pattern `Foo/__init__` and `include_body=True`. If you don't know yet which methods in `Foo` you need to read or edit,\\nyou can use `lsp.find_symbol` with name path pattern `Foo`, `include_body=False` and `depth=1` to get all (top-level) members of `Foo` before proceeding\\nto read the desired methods with `include_body=True`.\\nYou can understand relationships between symbols by using `lsp.find_referencing_symbols`.\\n\\n\\nYou generally have access to memories and it may be useful for you to read them.\\nYou infer whether memories are relevant based on their names.\\n\\n\\nLine numbers returned by Serena's tools are 0-based!\\n\\nSerena executes tool calls one at a time internally, even when you request several at once. So whenever you have\\nindependent operations to perform, you can safely issue them as parallel tool calls in a single turn: they are applied\\nin the order issued and cannot race with or corrupt one another, and batching them this way saves round-trips. Every\\nseparate round-trip re-sends the whole growing context, so maximizing parallel tool calls is the single biggest lever\\non cost — err on the side of batching. Only call tools sequentially when one genuinely depends on the result of another.\\n\\nThe context and modes of operation are described below. These determine how to interact with your user\\nand which kinds of interactions are expected of you.\\n\\n<context>\\nYou are running in a desktop application context.\\nSerena's tools give you access to the code base as well as some access to the file system (if enabled). \\nYou interact with the user through a chat interface that is separated from the code base. \\nAs a consequence, if you are in interactive mode, your communication with the user should\\ninvolve high-level thinking and planning as well as some summarization of any code edits that you make.\\nTo view the code edits you make, the user will have switch to a separate application.\\nTo illustrate complex relationships, consider creating diagrams in addition to your text-based communication\\n(depending on the options for text, html, mermaid diagrams, etc. that you are provided with in your initial instructions).\\n</context>\\n\\n\\n<mode name=\\\"editing\\\">\\nUse the symbolic editing tools for precise, structure-aware code modifications.\\n\\n**Refactoring tools**\\nFor operations on existing symbols, prefer the dedicated refactoring tools over hand-edits:\\n`lsp.rename_symbol` and `lsp.safe_delete_symbol` —\\nthey are reference-aware and update or check all usages atomically. When such a tool returns success, the\\nrefactoring is already complete and c…[truncated]",
          "arguments": {}
        },
        "durationMs": 257
      },
      {
        "id": "L2.output_schema",
        "tool": "initial_instructions",
        "status": "pass"
      },
      {
        "id": "L2.bad_input",
        "tool": "initial_instructions",
        "detail": "no schema violation can be crafted",
        "status": "skipped"
      },
      {
        "id": "L2.call_ok",
        "tool": "serena_repl",
        "detail": "mutation_description",
        "status": "untested"
      },
      {
        "id": "L2.timeout",
        "detail": "2 calls answered within 30000 ms",
        "status": "pass"
      }
    ],
    "metrics": {
      "callMs": [
        73,
        16,
        257
      ],
      "toolsListMs": 16,
      "initializeMs": 69664
    },
    "facts": {
      "authModel": "none",
      "transport": "stdio",
      "capabilities": [
        "experimental",
        "prompts",
        "resources",
        "tools"
      ],
      "toolAnnotations": {
        "readOnly": 2,
        "unmarked": 0,
        "destructive": 1
      },
      "credentialsInUrl": false
    }
  },
  "l3": {
    "uptime": {
      "24h": null,
      "7d": 1,
      "30d": 1
    },
    "sampleSize": {
      "24h": 0,
      "7d": 1,
      "30d": 1
    },
    "latency": {
      "initialize": {
        "p50": null,
        "p95": null
      },
      "calls": {
        "p50": 73,
        "p95": 257
      }
    },
    "flakiness": null,
    "versionDrift": []
  },
  "history": [
    {
      "startedAt": "2026-10-29T06:52:56.782Z",
      "runKind": "full",
      "l0Ok": true,
      "verdict": "alive"
    }
  ]
}