Borrowing it
Nothing to install: this file belongs to Vasallo94/obsidian-mcp-server. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/Vasallo94/obsidian-mcp-server/main/.agents/skills/test-runner/SKILL.mdgit clone --depth 1 https://github.com/Vasallo94/obsidian-mcp-serverWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/vasallo94/obsidian-mcp-server/test-runner)<a href="https://agentmods.dev/skills/vasallo94/obsidian-mcp-server/test-runner"><img src="https://agentmods.dev/badge/skills/vasallo94/obsidian-mcp-server/test-runner.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00028 | $0.00997 |
| Opus 5 | $0.00014 | $0.00498 |
| Sonnet 5 | $0.00006 | $0.00199 |
| Haiku 4.5 | $0.00003 | $0.00100 |
Grade A, and why
Test Runner scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 6d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 210 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Test Runner Skill
Cuándo usar esta skill
- Cuando ejecutes tests del proyecto.
- Cuando añadas nuevos tests.
- Cuando debuggees tests que fallan.
- Cuando necesites verificar cobertura.
Comandos de Ejecución
Ejecutar todos los tests
uv run pytest tests/
Ejecutar test específico
# Por archivo
uv run pytest tests/test_basic.py
# Por función
uv run pytest tests/test_basic.py::test_function_name
# Por clase
uv run pytest tests/test_basic.py::TestClassName
Opciones útiles
# Verbose - más detalle
uv run pytest tests/ -v
# Stop en primer fallo
uv run pytest tests/ -x
# Solo tests que fallaron antes
uv run pytest tests/ --lf
# Mostrar prints
uv run pytest tests/ -s
# Combinado: verbose, stop, prints
uv run pytest tests/ -vxs
Estructura de Tests
Los tests están en tests/:
tests/
├── conftest.py # Fixtures compartidas
├── test_basic.py # Tests de herramientas básicas
├── test_security.py # Tests de seguridad/paths
├── test_agents.py # Tests de carga de skills
├── test_connection_logic.py # Tests de conexiones semánticas
└── test_image_indexing.py # Tests de indexación de imágenes
Patrón para Nuevos Tests
"""
Tests para {módulo}.
"""
import pytest
import anyio # Para tests async
from obsidian_mcp.module import function_to_test
class TestFunctionName:
"""Tests para function_to_test."""
def test_caso_normal(self) -> None:
"""Verifica comportamiento normal."""
result = function_to_test("input")
assert result == "expected"
def test_caso_error(self) -> None:
"""Verifica manejo de errores."""
with pytest.raises(ValueError):
function_to_test(None)
@pytest.mark.asyncio
async def test_async_function(self) -> None:
"""Verifica función asíncrona."""
result = await async_function()
assert result is not None
Fixtures Comunes
En conftest.py:
import pytest
from pathlib import Path
@pytest.fixture
def test_vault(tmp_path: Path) -> Path:
"""Crea un vault temporal para tests."""
vault = tmp_path / "test_vault"
vault.mkdir()
# Crear estructura básica
(vault / "note1.md").write_text("# Test Note")
return vault
@pytest.fixture
def sample_note(test_vault: Path) -> Path:
"""Crea una nota de ejemplo."""
note = test_vault / "sample.md"
note.write_text("---\ntags: [test]\n---\n# Sample")
return note
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 6d ago First seen · 210 lines · 28 tokens per session scan A bbbe50c2b58a
Test Runner is a skill published in the GitHub repository Vasallo94/obsidian-mcp-server (9 stars, last pushed 4d ago), licensed MIT. It adds 28 tokens to every session and 997 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
api-errors
McpError constructor, JsonRpcErrorCode reference, and error handling patterns for @cyanheads/mcp-ts-core. Use when looking up error codes, understanding where errors should be thrown vs. caught, or using ErrorHandler.tryCatch in services.
api-testing
Testing patterns for MCP tool/resource handlers using createMockContext and Vitest. Covers mock context options, handler testing, McpError assertions, format testing, Vitest config setup, and test isolation conventions.
field-test
Exercise tools, resources, and prompts against a live HTTP server via MCP JSON-RPC over curl. Starts the server, surfaces the catalog, runs real and adversarial inputs, and produces a tight report with concrete findings and numbered follow-up options. Use after adding or modifying definitions, or when the user asks to…
add-test
Scaffold a test file for an existing tool, resource, or service. Use when the user asks to add tests, improve coverage, or when a definition exists without a matching test file.
report-issue-framework
File a bug or feature request against @cyanheads/mcp-ts-core when you hit a framework issue. Use when a builder, utility, context method, or config behaves contrary to the documented API — not for server-specific application bugs.
report-issue-local
File a bug or feature request against this MCP server's own repo. Use for server-specific issues — tool logic, service integrations, config problems, or domain bugs that aren't caused by the framework.