{"passport":{"unfragile":{"@version":"1.0","version":"2026-05","artifact":{"id":"awesome-obsidian","slug":"obsidian","name":"Obsidian","type":"mcp","url":"https://github.com/MarkusPfundstein/mcp-obsidian","page_url":"https://unfragile.ai/obsidian","categories":["mcp-servers"],"tags":[],"pricing":{"model":"open_source","free":true,"starting_price":null},"status":"active","verified":false},"capabilities":[{"id":"awesome-obsidian__cap_0","uri":"capability://tool.use.integration.mcp.protocol.compliant.vault.bridging.with.stdio.based.communication","name":"mcp protocol-compliant vault bridging with stdio-based communication","description":"Implements a Python-based MCP server that launches as a subprocess and communicates with MCP clients (Claude Desktop) via stdio, translating high-level tool requests into structured MCP protocol messages. The server registers 13 tools dynamically, handles request routing through call_tool and list_tools handlers, and manages the full MCP lifecycle including initialization and tool discovery without requiring direct file system access to Obsidian vaults.","intents":["Enable Claude Desktop to interact with Obsidian vaults through a standardized protocol interface","Avoid fragile direct file system manipulation by routing all vault operations through Obsidian's REST API","Expose Obsidian vault capabilities as discoverable tools within Claude's tool-calling framework"],"best_for":["AI assistant developers integrating Obsidian knowledge bases with Claude Desktop","Teams building AI-augmented knowledge management workflows","Developers extending Claude's capabilities with local knowledge vault access"],"limitations":["Requires Obsidian Local REST API community plugin to be installed and running on the target vault","Subprocess-based execution adds ~50-100ms latency per request due to process spawning overhead","No built-in persistence or caching of vault state between requests — each operation is stateless","Limited to Python 3.11+ runtime; no native support for other languages"],"requires":["Python 3.11+","mcp>=1.1.0 library","Obsidian Local REST API community plugin installed in target vault","Claude Desktop or compatible MCP client","Environment variables: OBSIDIAN_VAULT_NAME, OBSIDIAN_REST_API_KEY"],"input_types":["MCP protocol messages (JSON-RPC 2.0 format)","Tool invocation requests with typed arguments"],"output_types":["MCP protocol responses","TextContent formatted tool results","Error responses with diagnostic information"],"categories":["tool-use-integration","automation-workflow"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_1","uri":"capability://memory.knowledge.rest.api.mediated.vault.file.read.operations.with.content.retrieval","name":"rest api-mediated vault file read operations with content retrieval","description":"Implements file reading capability by translating MCP tool requests into HTTP GET calls to Obsidian's REST API vault/read endpoint, parsing JSON responses containing file metadata and content, and returning formatted text content to the client. Supports reading any file type stored in the vault (markdown, JSON, images as base64) with automatic error handling for missing files and permission issues.","intents":["Retrieve the full content of a specific note by file path for analysis or context","Read vault configuration files or metadata without direct file system access","Fetch file metadata including creation date, modification date, and size alongside content"],"best_for":["Knowledge workers querying their Obsidian vault from Claude for research or synthesis","AI agents building context from vault notes before generating responses","Automation workflows that need to read note content as input to downstream processing"],"limitations":["Cannot stream large files — entire file content must be loaded into memory before returning","Binary files (images, PDFs) are returned as base64-encoded strings, increasing response size by ~33%","No partial file reading — must fetch entire file even if only a section is needed","REST API timeout of ~30 seconds limits reading of extremely large vault files (>10MB)"],"requires":["Obsidian Local REST API plugin with read permissions enabled","Valid file path relative to vault root","Network connectivity to Obsidian REST API endpoint (localhost:27123 by default)"],"input_types":["file path (string, relative to vault root)"],"output_types":["file content (string for text files, base64 for binary)","file metadata (creation date, modification date, size)"],"categories":["memory-knowledge","data-processing-analysis"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_10","uri":"capability://automation.workflow.async.await.based.request.handling.with.non.blocking.i.o","name":"async/await based request handling with non-blocking i/o","description":"Implements the MCP server using Python's asyncio framework with async/await syntax, enabling non-blocking I/O for HTTP requests to Obsidian's REST API. The implementation uses async context managers for resource cleanup and async generators for streaming responses, allowing the server to handle multiple concurrent client requests without blocking.","intents":["Handle multiple concurrent tool invocations from Claude without blocking","Improve server responsiveness by using non-blocking I/O for REST API calls","Support long-running operations (large file reads, vault-wide searches) without freezing the server","Enable efficient resource utilization on systems with limited threads"],"best_for":["High-concurrency deployments where multiple Claude instances query the same vault","Long-running operations that would block synchronous servers","Developers building responsive MCP servers with minimal resource overhead"],"limitations":["Async/await adds complexity to code — requires understanding of event loops and coroutines","requests library is synchronous — async calls to REST API are actually blocking in thread pool","No true parallelism for CPU-bound operations — asyncio is I/O-bound only","Debugging async code is harder than synchronous code — stack traces are less readable"],"requires":["Python 3.11+ with asyncio support","mcp library with async server support","Understanding of async/await syntax and event loop concepts"],"input_types":["MCP protocol messages (async streams)"],"output_types":["MCP protocol responses (async streams)"],"categories":["automation-workflow","tool-use-integration"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_11","uri":"capability://search.retrieval.vault.file.listing.and.directory.traversal.with.metadata","name":"vault file listing and directory traversal with metadata","description":"Implements file listing capability by querying Obsidian's REST API vault/list endpoint to retrieve directory contents with file metadata (size, type, modification date). The implementation supports recursive directory traversal and filtering by file type, enabling clients to explore vault structure and discover files without direct file system access.","intents":["Explore vault directory structure to discover available notes","List all files in a directory to find related notes or resources","Filter files by type (markdown, images, etc.) for targeted discovery","Build file browsers or navigation interfaces for vault exploration"],"best_for":["Knowledge workers exploring their vault structure through Claude","Automation workflows that need to discover files matching specific criteria","Building vault navigation or search interfaces"],"limitations":["Recursive listing can be slow for deeply nested vaults — no pagination support","File metadata is limited to size, type, and modification date — no extended attributes","Symlinks and aliases are not handled specially — may cause duplicate entries","No support for filtering by file name pattern — must filter results client-side"],"requires":["Obsidian Local REST API plugin","Valid directory path relative to vault root","Network connectivity to Obsidian REST API endpoint"],"input_types":["directory path (string, relative to vault root)","optional: recursive flag (boolean)"],"output_types":["list of files with paths","file metadata (size, type, modification date)","directory structure (if recursive)"],"categories":["search-retrieval","memory-knowledge"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_12","uri":"capability://search.retrieval.tag.based.note.filtering.and.discovery.with.metadata.extraction","name":"tag-based note filtering and discovery with metadata extraction","description":"Implements tag-based filtering by parsing note frontmatter and content to extract tags, then filtering notes by tag matches. The implementation supports both YAML frontmatter tags and inline tag syntax (#tag), enabling clients to discover notes by topic without full-text search.","intents":["Find all notes tagged with a specific topic or category","Discover related notes by filtering on common tags","Build tag-based navigation or knowledge graph visualization","Organize vault exploration by topic rather than file path"],"best_for":["Knowledge workers using tags to organize their vault","Building tag-based navigation interfaces for vault exploration","Automation workflows that need to find notes by topic"],"limitations":["Tag extraction requires reading full note content — slow for large vaults","No support for hierarchical tags (e.g., #topic/subtopic) — treated as single tag","Tag matching is case-sensitive — #Topic and #topic are different tags","No caching of tag index — tag queries require scanning all notes"],"requires":["Notes must use YAML frontmatter or inline #tag syntax","Tag name (string)","Obsidian Local REST API plugin"],"input_types":["tag name (string)"],"output_types":["list of notes with matching tags","tag metadata (count, related tags)"],"categories":["search-retrieval","memory-knowledge"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_13","uri":"capability://search.retrieval.backlink.and.forward.link.graph.traversal.for.knowledge.graph.navigation","name":"backlink and forward link graph traversal for knowledge graph navigation","description":"Implements link traversal capability by parsing note content to extract wiki-style links ([[note-name]]) and backlinks, enabling clients to navigate the knowledge graph and discover related notes. The implementation builds a link graph by analyzing note content and provides methods to traverse forward links (outgoing) and backlinks (incoming).","intents":["Discover related notes by following links in the knowledge graph","Build context by traversing backlinks to find notes that reference a given note","Analyze knowledge graph structure to identify central or isolated notes","Enable knowledge graph visualization or exploration interfaces"],"best_for":["Knowledge workers exploring their vault through link relationships","Building knowledge graph visualization or analysis tools","Automation workflows that need to traverse note relationships"],"limitations":["Link graph construction requires reading all note content — very slow for large vaults (10,000+ notes)","No caching of link graph — graph is rebuilt on each query","Broken links (links to non-existent notes) are included in results","Alias links and embed syntax are not fully supported — only [[note-name]] syntax"],"requires":["Notes must use wiki-style [[note-name]] link syntax","Obsidian Local REST API plugin","Sufficient memory to store link graph for entire vault"],"input_types":["note name (string)","optional: traversal depth (integer, default 1)"],"output_types":["list of forward links (outgoing)","list of backlinks (incoming)","link graph structure (if requested)"],"categories":["search-retrieval","memory-knowledge"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_2","uri":"capability://automation.workflow.rest.api.mediated.vault.file.write.operations.with.content.patching","name":"rest api-mediated vault file write operations with content patching","description":"Implements file writing capability by translating MCP tool requests into HTTP POST calls to Obsidian's REST API vault/write endpoint, supporting both full file replacement and targeted content patching via search-and-replace operations. The implementation validates file paths, handles encoding for text and binary content, and provides atomic write semantics through Obsidian's internal file handling.","intents":["Create new notes in the vault with specified content and metadata","Update existing note content with new information or corrections","Perform targeted text replacements within notes without overwriting the entire file","Append content to existing notes while preserving prior content"],"best_for":["AI agents that autonomously update knowledge bases with new findings or corrections","Automation workflows that generate and store vault notes programmatically","Knowledge workers using Claude to draft and save notes directly to their vault"],"limitations":["Search-and-replace patching requires exact string matching — no regex support in the REST API","Concurrent writes to the same file from multiple clients can cause race conditions; no built-in locking","File creation does not automatically create parent directories — parent folders must exist","No transaction support — partial writes cannot be rolled back if operation fails mid-way"],"requires":["Obsidian Local REST API plugin with write permissions enabled","Valid file path relative to vault root","For patching: exact string to search for and replacement text","Network connectivity to Obsidian REST API endpoint"],"input_types":["file path (string)","file content (string for text, base64 for binary)","optional: search string and replacement string for patching"],"output_types":["confirmation of write operation","updated file metadata","error details if write fails"],"categories":["automation-workflow","data-processing-analysis"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_3","uri":"capability://search.retrieval.vault.wide.full.text.search.with.query.based.content.discovery","name":"vault-wide full-text search with query-based content discovery","description":"Implements search capability by translating MCP tool requests into HTTP POST calls to Obsidian's REST API vault/search endpoint with query parameters, returning ranked lists of matching files with excerpt snippets and relevance scores. The implementation supports boolean operators, phrase matching, and field-specific searches (title, content, tags) through Obsidian's native search syntax.","intents":["Find all notes matching a specific topic or keyword across the entire vault","Discover related notes by searching for common themes or tags","Locate notes containing specific phrases or code snippets for reference","Build context for AI responses by retrieving relevant vault content based on query"],"best_for":["Knowledge workers using Claude to explore their vault and discover connections","AI agents building context from vault search results before generating responses","Automation workflows that need to find notes matching specific criteria"],"limitations":["Search results are limited to first 100 matches by default; pagination not supported in REST API","Excerpt snippets are truncated to ~200 characters; full context requires separate read operation","Search performance degrades with vault size — searches on 10,000+ note vaults may timeout","No support for fuzzy matching or typo tolerance; queries must match exact text or use wildcards"],"requires":["Obsidian Local REST API plugin with search enabled","Query string using Obsidian search syntax (supports AND, OR, NOT, phrase matching)","Network connectivity to Obsidian REST API endpoint"],"input_types":["search query (string, supports Obsidian search operators)"],"output_types":["list of matching files with paths","excerpt snippets showing context around matches","relevance scores or match counts"],"categories":["search-retrieval","memory-knowledge"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_4","uri":"capability://memory.knowledge.periodic.notes.retrieval.with.date.based.note.discovery","name":"periodic notes retrieval with date-based note discovery","description":"Implements periodic notes capability by querying Obsidian's REST API for notes matching periodic note naming conventions (daily, weekly, monthly, yearly notes) based on date parameters. The implementation translates date inputs into note paths using Obsidian's configurable periodic note naming format, retrieves matching notes, and returns their content with date metadata.","intents":["Retrieve today's daily note or a specific date's daily note for context or updates","Access weekly or monthly review notes for progress tracking or planning","Build chronological context by fetching multiple periodic notes across a date range","Integrate vault-based journaling or time-tracking data into AI workflows"],"best_for":["Knowledge workers using daily notes for journaling and wanting Claude to reference them","Productivity workflows that synthesize periodic notes into summaries or reports","AI agents building temporal context from vault-based time-tracking or journaling"],"limitations":["Requires Obsidian Periodic Notes plugin to be installed and configured with naming format","Naming format must match Obsidian's configuration exactly — custom formats require manual configuration","No support for custom periodic note types beyond daily/weekly/monthly/yearly","Date range queries are not supported — must fetch individual dates separately"],"requires":["Obsidian Periodic Notes community plugin installed and configured","Date in ISO 8601 format (YYYY-MM-DD) or relative date string (today, yesterday, etc.)","Periodic note naming format configured in Obsidian settings"],"input_types":["date (ISO 8601 string or relative: today, yesterday, this week, etc.)","note type (daily, weekly, monthly, yearly)"],"output_types":["note content (string)","note path (string)","date metadata"],"categories":["memory-knowledge","data-processing-analysis"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_5","uri":"capability://automation.workflow.recent.vault.changes.tracking.with.modification.timestamp.filtering","name":"recent vault changes tracking with modification timestamp filtering","description":"Implements change tracking capability by querying Obsidian's REST API for recently modified files, filtering by modification timestamp and returning a chronologically sorted list of changed files with metadata. The implementation enables time-window based queries (e.g., 'files changed in last 24 hours') without requiring external change logs or file system monitoring.","intents":["Retrieve a list of recently updated notes to provide Claude with current vault context","Track vault activity by discovering which notes were modified in a specific time window","Build incremental sync workflows that only process changed files since last check","Monitor vault changes for audit or notification purposes"],"best_for":["Automation workflows that need to process only recently changed vault content","Knowledge workers wanting Claude to focus on recent updates in their vault","Change tracking or audit systems that monitor vault modifications"],"limitations":["Timestamp filtering is approximate — REST API returns files modified within ~5 minute windows","No support for filtering by file type or directory — returns all changed files","Change tracking does not include deletion history — deleted files are not reported","Limited to last 100 modified files; older changes are not accessible"],"requires":["Obsidian Local REST API plugin","Optional: timestamp or relative time window (e.g., '24h', '7d')","Network connectivity to Obsidian REST API endpoint"],"input_types":["optional: time window (relative: 24h, 7d, etc. or absolute: ISO 8601 timestamp)"],"output_types":["list of recently modified files with paths","modification timestamps","file metadata (size, type)"],"categories":["automation-workflow","data-processing-analysis"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_6","uri":"capability://tool.use.integration.obsidian.rest.api.client.with.authentication.and.error.handling","name":"obsidian rest api client with authentication and error handling","description":"Implements a dedicated Obsidian class that manages HTTP communication with Obsidian's Local REST API, handling authentication via API key headers, request/response serialization, error parsing, and retry logic. The client abstracts HTTP details from tool handlers, providing typed methods for each REST endpoint (read, write, search, etc.) with consistent error handling and response normalization.","intents":["Provide a clean Python interface to Obsidian's REST API without exposing HTTP details to tool handlers","Manage authentication credentials and API key injection across all requests","Handle API errors gracefully with informative error messages and retry logic","Normalize REST API responses into consistent Python objects for tool handlers"],"best_for":["MCP server developers extending mcp-obsidian with new tools","Teams building custom Obsidian integrations that need reliable API communication","Developers debugging Obsidian API interactions and error handling"],"limitations":["No connection pooling — creates new HTTP connection for each request, adding ~50ms latency","Retry logic is basic (fixed 3 retries) — no exponential backoff or jitter","No support for streaming responses — all responses must fit in memory","Authentication is API key only — no support for OAuth or other auth methods"],"requires":["requests>=2.32.3 library","Obsidian Local REST API plugin running and accessible","API key from Obsidian REST API plugin settings","Environment variables: OBSIDIAN_REST_API_KEY, OBSIDIAN_VAULT_NAME"],"input_types":["HTTP method (GET, POST, etc.)","endpoint path (string)","request parameters (dict)","request body (dict or string)"],"output_types":["parsed JSON response (dict)","error details with HTTP status and message","None for successful operations with no response body"],"categories":["tool-use-integration","automation-workflow"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_7","uri":"capability://tool.use.integration.toolhandler.abstraction.pattern.for.tool.implementation.and.response.formatting","name":"toolhandler abstraction pattern for tool implementation and response formatting","description":"Implements a base ToolHandler class that all 13 tools inherit from, defining a consistent interface for tool execution (execute method), argument validation, and response formatting as TextContent objects. The pattern enables rapid tool development by providing common utilities for error handling, logging, and MCP response formatting while allowing each tool to focus on business logic.","intents":["Standardize how tools are implemented and integrated into the MCP server","Ensure consistent error handling and response formatting across all tools","Enable rapid development of new tools by providing a reusable base class","Simplify testing and debugging by isolating tool logic from MCP protocol details"],"best_for":["MCP server developers extending mcp-obsidian with new Obsidian tools","Teams maintaining multiple MCP servers who want to reuse the ToolHandler pattern","Developers learning how to structure MCP tool implementations"],"limitations":["ToolHandler pattern adds ~10-20ms overhead per tool execution due to abstraction layers","All tools must return TextContent format — no support for other MCP response types (images, etc.)","Error handling is standardized but may not suit all tool-specific error scenarios","No built-in support for tool-specific configuration or state management"],"requires":["Python 3.11+","mcp library with TextContent class","Understanding of MCP tool protocol and response formats"],"input_types":["tool arguments (dict with typed values)","Obsidian client instance"],"output_types":["TextContent MCP response object","error TextContent with diagnostic information"],"categories":["tool-use-integration","code-generation-editing"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_8","uri":"capability://tool.use.integration.dynamic.tool.registration.and.discovery.with.mcp.protocol.compliance","name":"dynamic tool registration and discovery with mcp protocol compliance","description":"Implements a tool registration system in the MCP server that dynamically discovers all ToolHandler subclasses at startup, registers them with the MCP server, and exposes them through the list_tools and call_tool handlers. The implementation uses Python's introspection to automatically generate tool schemas from handler class definitions, eliminating manual schema maintenance.","intents":["Automatically expose all implemented tools to MCP clients without manual registration code","Enable MCP clients to discover available tools and their schemas through the list_tools handler","Route tool invocation requests to the correct handler based on tool name","Support adding new tools without modifying the server registration logic"],"best_for":["MCP server developers who want to add new tools without modifying server code","Teams building extensible MCP servers with plugin-like tool architecture","Developers who want automatic schema generation from tool handler definitions"],"limitations":["Tool discovery relies on class naming conventions — tools must inherit from ToolHandler","Schema generation from class definitions may not capture all nuances of tool behavior","No support for conditional tool registration based on runtime configuration","Tool ordering in list_tools response is non-deterministic (depends on Python's class discovery order)"],"requires":["Python 3.11+ with introspection capabilities","mcp library with tool registration API","All tools must be ToolHandler subclasses in tools.py"],"input_types":["ToolHandler subclass definitions"],"output_types":["MCP tool schema objects","tool invocation routing to correct handler"],"categories":["tool-use-integration","automation-workflow"],"confidence":0.5,"matches":0,"success_rate":0},{"id":"awesome-obsidian__cap_9","uri":"capability://automation.workflow.environment.based.configuration.with.vault.and.api.key.management","name":"environment-based configuration with vault and api key management","description":"Implements configuration management through environment variables (OBSIDIAN_VAULT_NAME, OBSIDIAN_REST_API_KEY) loaded via python-dotenv, enabling secure credential storage and vault selection without hardcoding. The implementation supports .env file loading for local development and environment variable injection for production deployments (Claude Desktop config).","intents":["Securely store Obsidian API credentials without embedding them in code","Support multiple vault configurations through environment variable switching","Enable easy deployment to different environments (local, cloud) with different credentials","Simplify Claude Desktop configuration by using standard environment variable injection"],"best_for":["Developers deploying mcp-obsidian to Claude Desktop with secure credential management","Teams managing multiple Obsidian vaults with different API keys","Security-conscious users who want to avoid hardcoding credentials"],"limitations":["Environment variables are loaded at server startup — changes require server restart","No support for credential rotation or expiration — API keys must be manually updated",".env files are not encrypted — credentials are stored in plaintext on disk","No validation of environment variables at startup — missing credentials cause runtime errors"],"requires":["python-dotenv>=1.0.1 library","Environment variables: OBSIDIAN_VAULT_NAME, OBSIDIAN_REST_API_KEY","Optional: .env file in project root for local development"],"input_types":["environment variables (strings)",".env file (text format)"],"output_types":["parsed configuration dict","error if required variables are missing"],"categories":["automation-workflow","safety-moderation"],"confidence":0.5,"matches":0,"success_rate":0}],"trust":{"score":28,"verified":false,"data_access_risk":"high","permissions":["Python 3.11+","mcp>=1.1.0 library","Obsidian Local REST API community plugin installed in target vault","Claude Desktop or compatible MCP client","Environment variables: OBSIDIAN_VAULT_NAME, OBSIDIAN_REST_API_KEY","Obsidian Local REST API plugin with read permissions enabled","Valid file path relative to vault root","Network connectivity to Obsidian REST API endpoint (localhost:27123 by default)","Python 3.11+ with asyncio support","mcp library with async server support"],"failure_modes":["Requires Obsidian Local REST API community plugin to be installed and running on the target vault","Subprocess-based execution adds ~50-100ms latency per request due to process spawning overhead","No built-in persistence or caching of vault state between requests — each operation is stateless","Limited to Python 3.11+ runtime; no native support for other languages","Cannot stream large files — entire file content must be loaded into memory before returning","Binary files (images, PDFs) are returned as base64-encoded strings, increasing response size by ~33%","No partial file reading — must fetch entire file even if only a section is needed","REST API timeout of ~30 seconds limits reading of extremely large vault files (>10MB)","Async/await adds complexity to code — requires understanding of event loops and coroutines","requests library is synchronous — async calls to REST API are actually blocking in thread pool","builder identity is not verified yet","no observed match outcomes yet"],"rank_breakdown":{"adoption":0.05,"quality":0.35,"ecosystem":0.39999999999999997,"match_graph":0.25,"freshness":0.52,"weights":{"adoption":0.25,"quality":0.25,"ecosystem":0.15,"match_graph":0.23,"freshness":0.12}},"observed_outcomes":{"matches":0,"success_rate":0,"avg_confidence":0,"top_intents":[],"last_matched_at":null},"maintenance":{"status":"active","updated_at":"2026-06-17T09:51:03.579Z","last_scraped_at":"2026-05-03T14:00:15.503Z","last_commit":null},"community":{"stars":null,"forks":null,"weekly_downloads":null,"model_downloads":null,"model_likes":null}},"distribution":{"claim_url":"https://unfragile.ai/submit?claim=obsidian","compare_url":"https://unfragile.ai/compare?artifact=obsidian"}},"signature":"GFyGWCG5eqIWPILNT4FY2InCbLvEcnI/HA3Qs+9vn2xWlaaCh94rKQ/e9+4v0o/vjImLINJYLh+eLA+34nWoAQ==","signedAt":"2026-06-21T04:59:13.549Z","signedBy":"unfragile.ai","version":1},"_links":{"self":"https://unfragile.ai/api/v1/passport/obsidian","artifact":"https://unfragile.ai/obsidian","verify":"https://unfragile.ai/api/v1/verify?slug=obsidian","publicKey":"https://unfragile.ai/api/v1/trust-passport-public-key","spec":"https://unfragile.ai/trust","schema":"https://unfragile.ai/schema.json","docs":"https://unfragile.ai/docs"}}