Skip to main content
Glama
kj455

MCP Kibela

by kj455

kibela_create_note

Create a note in Kibela by providing title and markdown content, with optional group, folder, author, coediting, and draft settings.

Instructions

Create a new note in Kibela.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
titleYesrequired: Title of the note
contentYesrequired: Content of the note in markdown format
groupIdsNorequired: IDs of the groups to create the note in.
foldersNoIDs of the folders to add the note to.
authorIdNoID of the author of the note. If not specified, the note will be created by the authenticated user.
coeditingNorequired: Whether to enable co-editing for the note
draftNoWhether to create the note as a draft

Implementation Reference

  • The handler function that executes the 'kibela_create_note' tool logic. It validates required args (title, content, groupIds, coediting), calls the GraphQL createNote mutation, and returns the response.
      handler: async ({ title, content, groupIds, folders, authorId, coediting, draft }) => {
        if (!title || !content || !groupIds || !coediting) {
          throw new Error('Title, content, groupIds, and coediting are required')
        }
    
        const response = await createNote({
          input: {
            clientMutationId: uuid(),
            title,
            content,
            groupIds,
            folders,
            authorId,
            coediting,
            draft,
          },
        })
    
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(response.createNote, null, 2),
            },
          ],
        }
      },
    }
  • Type definition (CreateNoteArgs) and inputSchema for the tool, specifying required fields (title, content) and optional fields (groupIds, folders, authorId, coediting, draft).
    export type CreateNoteArgs = {
      title: string
      content: string
      groupIds: string[]
      coediting: boolean
      folders?: string[]
      authorId?: string
      draft?: boolean
    }
    
    export const createNoteTool: ToolDefinition<CreateNoteArgs> = {
      tool: {
        name: 'kibela_create_note',
        description: 'Create a new note in Kibela.',
        inputSchema: {
          type: 'object',
          properties: {
            title: {
              type: 'string',
              description: 'required: Title of the note',
            },
            content: {
              type: 'string',
              description: 'required: Content of the note in markdown format',
            },
            groupIds: {
              type: 'array',
              items: {
                type: 'string',
              },
              description: 'required: IDs of the groups to create the note in.',
            },
            folders: {
              type: 'array',
              items: {
                type: 'string',
              },
              description: 'IDs of the folders to add the note to.',
            },
            authorId: {
              type: 'string',
              description:
                'ID of the author of the note. If not specified, the note will be created by the authenticated user.',
            },
            coediting: {
              type: 'boolean',
              description: 'required: Whether to enable co-editing for the note',
            },
            draft: {
              type: 'boolean',
              description: 'Whether to create the note as a draft',
            },
          },
          required: ['title', 'content'],
        },
  • Registration of 'kibela_create_note' tool in the toolDefinitions map, mapping the tool name to the createNoteTool definition.
      kibela_create_note: createNoteTool,
    } as const
  • GraphQL mutation definition and helper function that sends the CreateNote mutation via gqlRequest.
    import { TypedDocumentNode } from '@graphql-typed-document-node/core'
    import { gql } from 'graphql-tag'
    import { gqlRequest } from '../request'
    
    type CreateNoteResponse = {
      createNote: {
        clientMutationId: string
        note: {
          id: string
          title: string
          content: string
          url: string
        }
      }
    }
    
    type CreateNoteVariables = {
      input: {
        clientMutationId: string
        title: string
        content: string
        coediting: boolean
        groupIds: string[]
        folders?: string[]
        authorId?: string
        draft?: boolean
      }
    }
    
    const createNoteMutation: TypedDocumentNode<CreateNoteResponse, CreateNoteVariables> = gql`
      mutation CreateNote($input: CreateNoteInput!) {
        createNote(input: $input) {
          clientMutationId
          note {
            id
            title
            content
            url
          }
        }
      }
    `
    
    export async function createNote(variables: CreateNoteVariables): Promise<CreateNoteResponse> {
      return gqlRequest(createNoteMutation, variables)
    }
  • TOOLS array export that includes the tool definition (name + schema) for MCP protocol registration.
    export const TOOLS = Object.values(toolDefinitions).map((def) => def.tool)
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is minimal and does not disclose behavioral traits such as permissions required, side effects, or rate limits. With no annotations, the description should provide more context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence. It is appropriately sized but could benefit from a slightly more structured presentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool creates a resource but lacks any mention of what the output or return value is. The absence of an output schema increases the need for description coverage, which is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with descriptions, so the baseline is 3. The tool description adds no additional meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Create') and the resource ('a new note in Kibela'). It differentiates from sibling tools which are focused on retrieval, search, or update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit usage guidance is provided. The purpose implies it is for creating notes, but there is no mention of when to use it versus alternatives like searching or updating.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/kj455/mcp-kibela'

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