Skip to main content
Glama
j-shelfwood

Obsidian Local REST API MCP Server

by j-shelfwood

get_metadata_values

Retrieve all unique values for a specific frontmatter key in your Obsidian vault to analyze metadata and organize notes.

Instructions

Get all unique values for a specific frontmatter key

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
keyYesFrontmatter key

Implementation Reference

  • Core implementation of the get_metadata_values tool in the ObsidianApiClient class. This method makes an HTTP request to the Obsidian REST API endpoint `/metadata/values/{key}` to retrieve unique values for the specified frontmatter key.
    async getMetadataValues(key: string) {
      return this.request(`/metadata/values/${encodeURIComponent(key)}`);
    }
  • Dispatch logic in the MCP server's CallToolRequest handler that routes calls to 'get_metadata_values' to the client implementation.
    case "get_metadata_values":
      result = await this.client.getMetadataValues(args?.key as string);
      break;
  • Input schema definition and tool registration for 'get_metadata_values' in the ListToolsRequest response.
    {
      name: "get_metadata_values",
      description: "Get all unique values for a specific frontmatter key",
      inputSchema: {
        type: "object",
        properties: {
          key: { type: "string", description: "Frontmatter key" },
        },
        required: ["key"],
      },
    },
  • src/index.ts:272-440 (registration)
    Registration of all tools including get_metadata_values via the ListToolsRequest handler in setupTools method.
    this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
      tools: [
        // Directory Operations
        {
          name: "list_directory",
          description: "List directory contents with pagination to prevent context overflow. Shows immediate contents by default.",
          inputSchema: {
            type: "object",
            properties: {
              path: { type: "string", description: "Directory path to list", default: "." },
              recursive: { type: "boolean", description: "Include subdirectories recursively", default: false },
              limit: { type: "number", description: "Maximum items to return", default: 50 },
              offset: { type: "number", description: "Pagination offset", default: 0 },
            },
          },
        },
    
        // File Operations
        {
          name: "read_file",
          description: "Read content of a specific file from the vault",
          inputSchema: {
            type: "object",
            properties: {
              path: { type: "string", description: "Path to the file" },
            },
            required: ["path"],
          },
        },
        {
          name: "write_file",
          description: "Write file content with different modes: overwrite (default), append, or prepend. Handles both create and update operations.",
          inputSchema: {
            type: "object",
            properties: {
              path: { type: "string", description: "Path to the file" },
              content: { type: "string", description: "Content to write" },
              mode: { type: "string", enum: ["overwrite", "append", "prepend"], description: "Write mode", default: "overwrite" },
            },
            required: ["path", "content"],
          },
        },
        {
          name: "delete_item",
          description: "Delete a file or directory from the vault",
          inputSchema: {
            type: "object",
            properties: {
              path: { type: "string", description: "Path to the item to delete" },
            },
            required: ["path"],
          },
        },
    
        // AI-Native Note Operations
        {
          name: "create_or_update_note",
          description: "Create or update a note with content and frontmatter. Performs upsert operation - creates if doesn't exist, updates if it does.",
          inputSchema: {
            type: "object",
            properties: {
              path: { type: "string", description: "Path for the note (without .md extension)" },
              content: { type: "string", description: "Note content" },
              frontmatter: { type: "object", description: "Frontmatter metadata", default: {} },
            },
            required: ["path", "content"],
          },
        },
        {
          name: "get_daily_note",
          description: "Get daily note for a specific date. Handles common daily note naming conventions and file locations.",
          inputSchema: {
            type: "object",
            properties: {
              date: { type: "string", description: "Date (today, yesterday, tomorrow, or YYYY-MM-DD)", default: "today" },
            },
          },
        },
        {
          name: "get_recent_notes",
          description: "Get recently modified notes, ordered by modification time",
          inputSchema: {
            type: "object",
            properties: {
              limit: { type: "number", description: "Number of recent notes to return", default: 5 },
            },
          },
        },
    
        // Enhanced Search and Discovery
        {
          name: "search_vault",
          description: "Search vault content across files, filenames, and metadata with advanced filtering",
          inputSchema: {
            type: "object",
            properties: {
              query: { type: "string", description: "Search query" },
              scope: {
                type: "array",
                items: { type: "string", enum: ["content", "filename", "tags"] },
                description: "Search scope - where to look for the query",
                default: ["content", "filename", "tags"]
              },
              path_filter: { type: "string", description: "Limit search to specific path prefix" },
            },
            required: ["query"],
          },
        },
        {
          name: "find_related_notes",
          description: "Find notes related to a given note based on shared tags, links, or backlinks",
          inputSchema: {
            type: "object",
            properties: {
              path: { type: "string", description: "Path to the source note" },
              on: {
                type: "array",
                items: { type: "string", enum: ["tags", "links"] },
                description: "Relationship criteria to use for finding related notes",
                default: ["tags", "links"]
              },
            },
            required: ["path"],
          },
        },
    
        // Legacy Tools (for backward compatibility)
        {
          name: "get_note",
          description: "Get a specific note with its content and metadata (legacy)",
          inputSchema: {
            type: "object",
            properties: {
              path: { type: "string", description: "Path to the note" },
            },
            required: ["path"],
          },
        },
        {
          name: "list_notes",
          description: "List all notes in the vault with optional search filter (legacy with search support)",
          inputSchema: {
            type: "object",
            properties: {
              search: { type: "string", description: "Optional search query to filter notes" },
            },
          },
        },
        {
          name: "get_metadata_keys",
          description: "Get all available frontmatter keys from notes",
          inputSchema: {
            type: "object",
            properties: {},
          },
        },
        {
          name: "get_metadata_values",
          description: "Get all unique values for a specific frontmatter key",
          inputSchema: {
            type: "object",
            properties: {
              key: { type: "string", description: "Frontmatter key" },
            },
            required: ["key"],
          },
        },
      ],
    }));

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/j-shelfwood/obsidian-local-rest-api-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server