Continue CLI, Vikunja MCP, Github MCP Registry, Gemini Extensions Directory

Published: Oct 21, 2025 by Isaac Johnson

There are a few things I want to tackle today. The first is getting started with the new Continue.dev CLI which should let us use models like those in Azure AI foundry with a CLI tool. I want to test Copilot, Gemini CLI and Continue’s CLI with our Vikunja MCP server.

Lastly, I want to try Github’s new OSS MCP Registry and see how hard that is to setup.

Continue Dev CLI

Let’s install with

$ npm i -g @continuedev/cli

I’ll want to ensure I’m using lts/jod or newere (NodeJS 22.x or newer)

$ nvm use lts/jod
Now using node v22.20.0 (npm v10.9.3)
$ npm i -g @continuedev/cli

added 86 packages in 7s

7 packages are looking for funding
  run `npm fund` for details

When we first launch (and you cannot use continue as that is a bash reserved word, so they called it cn), it either wants us to log into Continue.dev or enter an anthropic key

/content/images/2025/10/contcli-01.png

I decided to stick with the free trial account of Continue.dev:

/content/images/2025/10/contcli-02.png

Even though I set a GPT setup similar to this page

I could not get it to find my model

/content/images/2025/10/contcli-03.png

Until I manually set my config path

/content/images/2025/10/contcli-04.png

I keep get API key issues with my old GPT 4o deployment

/content/images/2025/10/contcli-05.png

Let’s fire a fresh model. I put myself on the waitlist for GPT-5-codex, but while I wait, I can try GPT-5-nano (which I’ve used for a while now elsewhere and it’s pretty solid)

/content/images/2025/10/contcli-06.png

I’ll use “Global Standard” as I can’t really see much difference between that and Data Zone standard

/content/images/2025/10/contcli-07.png

I’m going to try and piece together the required pieces for the config.yaml from the Azure AI Foundry model deployment page:

/content/images/2025/10/contcli-08.png

$ cat ~/.continue/config.yaml
name: Azure GPT 5 Nano
version: 1.0.0
schema: v1

models:
  - name: gpt-5-nano
    provider: azure
    model: gpt-5-nano
    apiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    apiBase: https://isaac-mgp1gfv5-eastus2.cognitiveservices.azure.com/
    defaultCompletionOptions:
      contextLength: 16384
    capabilities:
      - tool_use
      - next_edit
    env:
      apiVersion: 2024-12-01-preview
      deployment: gpt-5-nano
      apiType: azure-openai
    roles: [chat, edit, apply, summarize]

This time it worked!

/content/images/2025/10/contcli-09.png

Let’s use it to add another route to the MCP server

I tried to now use it by looking up a task

/content/images/2025/10/contcli-11.png

adding a comment

/content/images/2025/10/contcli-12.png

and attempting to update it. But unfortunately, it found no update tool

/content/images/2025/10/contcli-13.png

Looking back at the code, I noticed GPT 5 nano added some errant indentation

/content/images/2025/10/contcli-14.png

I corrected and did a push as 0.15:

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git add -A
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git commit -m "0.15 - fix indentation"
[main ab97ce1] 0.15 - fix indentation
 3 files changed, 27 insertions(+), 26 deletions(-)
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git push
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 16 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 562 bytes | 562.00 KiB/s, done.
Total 5 (delta 4), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To https://forgejo.freshbrewed.science/builderadmin/vikunjamcp.git
   c123df9..ab97ce1  main -> main

This time when I update the version, i saw it go from 7 to 8 tools - that is a good sign.

/content/images/2025/10/contcli-15.png

I’ve been letting the AIs do the lifting, but this is really quite easy. I’ll do one more update, this time manually (albeit I did allow some autocomplete to finish my typing). I want to show the existing comments on a task

@mcp.tool()
def lookup_comment_task(task_id: int):
    """
    Lists comments in a task in Vikunja.

    :param task_id: The ID of the task of which to fetch comments.
    """
    if "Authorization" not in session.headers:
        return "Please run the 'login' command first."

    try:
        response = session.get(f"{VIKUNJA_URL}/api/v1/tasks/{task_id}/comments")
        response.raise_for_status()
        comments = response.json()
        if not comments:
            return "No comments found for this task."
        
        result = []
        for comment in comments:
            comment_id = comment.get("id", "N/A")
            comment_text = comment.get("comment", "N/A")
            comment_created = comment.get("created", "N/A")
            comment_author = comment.get("author", "N/A")
            result.append(f"ID: {comment_id}, Created: {comment_created}, Author: {comment_author}, Comment: {comment_text}")
        return "\n".join(result)
    
    except requests.exceptions.RequestException as e:
        logger.exception("lookup_comment_task: request failed for task_id=%s", task_id)
        return f"Error looking up comments to task: {e}"

Updating at least suggests I got that 9th tool in

/content/images/2025/10/contcli-16.png

Let’s test. First, I’ll just ask Copilot for the Tools it sees. I do not know why it felt the need to lookup Projects, but it did come back with my list of tools:

/content/images/2025/10/contcli-17.png

Now let’s do a full flow and test updating comments

… back to Continue CLI

I went back and tried using GPT-4o on a different host.

Using the passed in --config worked like a champ

/content/images/2025/10/contcli-19.png

This did a pretty good job

/content/images/2025/10/contcli-20.png

Rules

I tried a lot of various ways of doing local rules, but at this point I do not see any working approach for local rules.

However, we can use “Hub Rules”

E.g., We can see this rule for “talk like a pirate”

then use it in our invokation:

builder@LuiGi:~/Workspaces/vikunjamcp$ cn --config ~/.continue/config.yaml --rule aeren/pirate --model gpt-4o


   ██████╗ ██████╗ ███╗   ██╗████████╗██╗███╗   ██╗██╗   ██╗███████╗
  ██╔════╝██╔═══██╗████╗  ██║╚══██╔══╝██║████╗  ██║██║   ██║██╔════╝
  ██║     ██║   ██║██╔██╗ ██║   ██║   ██║██╔██╗ ██║██║   ██║█████╗
  ██║     ██║   ██║██║╚██╗██║   ██║   ██║██║╚██╗██║██║   ██║██╔══╝
  ╚██████╗╚██████╔╝██║ ╚████║   ██║   ██║██║ ╚████║╚██████╔╝███████╗
   ╚═════╝ ╚═════╝ ╚═╝  ╚═══╝   ╚═╝   ╚═╝╚═╝  ╚═══╝ ╚═════╝ ╚══════╝
                                                     v1.4.49 (beta)

 Agent: Azure GPT 5 Nano
 Model: gpt-4o

 Rules:
 - aeren/pirate


● description the login tool in main.py

● Read(main.py)
  ⎿  Read tool output (431 lines)

 In main.py, the login tool in FastMCP authenticates with the Vikunja API to acquire a session token. Here be its
 purpose and process:

 Description:
 The login tool attempts to authenticate by sending the user's credentials (VIKUNJA_USERNAME and VIKUNJA_PASSWORD) to
 the Vikunja API, and if successful, stores the authorization token in the session headers for future requests.

 Code Breakdown:
 - Request: A POST request is sent to {VIKUNJA_URL}/api/v1/login with the username and password.
 - Token Retrieval: Extracts the token field from the response JSON.
 - Header Update: Updates session headers with "Authorization": "Bearer {token}".
 - Error Handling: Handles and logs errors, returning a failure message for any issues.

 Return messages:
 - Success: "Login successful. Token stored for session."
 - Failure (e.g., invalid credentials, API error): Detailed error message conveying the cause.

 Avast! Let me know if ye need further details!

Let’s try making our own on the Hub

/content/images/2025/10/contcli-21.png

I’ll detail out my standard Python rules

/content/images/2025/10/contcli-22.png

I now have an “isaac-johnson/pythondev” rule to which I can refer at https://hub.continue.dev/isaac-johnson/pythondev.

I think this is likely a smarter approach than local files as I tend to dance between hosts all the time.

Here is one that is a trimmed version I got from my colleague Nate:

/content/images/2025/10/contcli-23.png

So let’s use a controlled OpenAI endpoint with a rule that helps us learn:

MCP in Continue

I did try and add an MCP tool (this one) to Continue

mcpServers:
  - name: VikunjaMCP
    command: docker
    args:
      - run
      - -i
      - --rm
      - -e
      - VIKUNJA_URL
      - -e
      - VIKUNJA_USERNAME
      - -e
      - VIKUNJA_PASSWORD
      - harbor.freshbrewed.science/library/vikunjamcp:0.18
    env:
      VIKUNJA_URL: "https://vikunja.steeped.space"
      VIKUNJA_USERNAME: idjohnson
      VIKUNJA_PASSWORD: "xxxxxxxxxxxxxxxxxxxxxxx"

but it didnt seem to take. I saw no indication Docker ever started either

/content/images/2025/10/contcli-24.png

Then I caught a typo in my config that had a non-existent docker container. I fixed it (already corrected above), and tried again.

This is definitely showing a gap - i need just a general “get task details” tool.

I went off and coded some, paired with Copilot a bit for others.. but added a few more tools.

One of the ways I test that it added more tools is to just update the image tag in the mcp servers JSON Copilot uses. If I see the tool count go up, it’s a good sign (It doesn’t mean it works, mind you, just that it sees new tools)

Active tasks that shows our favourites now works:

/content/images/2025/10/contcli-27.png

Full details looks good:

/content/images/2025/10/contcli-28.png

There is a little bit of a consequence to all my local testing with Github Copilot (free tier). It seems to get slower and slower as I continually bang on it. I assume they are rate limiting in some fashion (which is acceptable), however I do notice it.

In fact, as I continued to test this morning, I did finally hit the wall

/content/images/2025/10/contcli-29.png

I moved back to Gemini and noticed it prompted me for an update. I wanted to see if the Gemini Extensions approach would catch that

/content/images/2025/10/contcli-30.png

It supports tab complete as you type the words to update

/content/images/2025/10/contcli-31.png

It then prompted me to update to 0.24 (which is the latest I am testing at this moment)

/content/images/2025/10/contcli-32.png

When done, i noticed it said it needs a restart

/content/images/2025/10/contcli-33.png

Restarting clearly showed the updated version

/content/images/2025/10/contcli-34.png

And it looked like it finally worked to add some lables (I’ve been working on that for way too long this morning)

/content/images/2025/10/contcli-35.png

I can now see them listed in the labels section of Vikunja on the web

/content/images/2025/10/contcli-36.png

In the details

/content/images/2025/10/contcli-37.png

and task list

/content/images/2025/10/contcli-38.png

Continue.ev VS Code (Linux)

I did something radical today. I just decided to switch to Ubuntu on my primary laptop.

I’m not sure what finally did it - fighting with the adverts in my start menu, the copilot everywhere or WSL ditching out all the time, but it was time to just go Linux.

However, in doing so, I was able to try doing this in VS Code in Linux. This time the mcpServers section took

/content/images/2025/10/vikunjamcp-42.png

After fixing a DNS issue with the local wifi, I could login. It asked me to accept the usage of the search tool

/content/images/2025/10/vikunjamcp-43.png

This then returned the results of which I had hoped

/content/images/2025/10/vikunjamcp-44.png

Github MCP Registry

This should be interesting. I am curious if I can publish to the Github registry an MCP server that is public, but does not use Github for the GIT storage.

First, I’ll want to install the mcp-publisher CLI

$ brew install mcp-publisher
==> Auto-updating Homebrew...
Adjust how often this is run with `$HOMEBREW_AUTO_UPDATE_SECS` or disable with
`$HOMEBREW_NO_AUTO_UPDATE=1`. Hide these hints with `$HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
==> Auto-updated Homebrew!
Updated 6 taps (loft-sh/tap, derailed/k9s, azure/functions, defenseunicorns/tap, homebrew/core and homebrew/cask).
==> New Formulae
airtable-mcp-server: MCP Server for Airtable
archgw: CLI for Arch Gateway
cagent: Agent Builder and Runtime by Docker Engineering
... snip ...


$ mcp-publisher --version
2025/10/14 12:34:55 mcp-publisher 1.3.0 (commit: Homebrew, built: 2025-10-14T12:28:10Z)

I was reading the documentation page and it suggests an “init” should setup proper values

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher init
Created server.json

Edit server.json to update:
  • Server name and description
  • Package details
  • Environment variables

Then publish with:
  mcp-publisher login github  # or your preferred auth method
  mcp-publisher publish

I think I have it right - I updated the JSON to match the Dockerhub location and added the proper environment variables

$ cat server.json
{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
  "name": "science.freshbrewed/vikunjamcp",
  "description": "An MCP server that provides access to Vikunja, a self-hosted task management solution.",
  "repository": {
    "url": "https://forgejo.freshbrewed.science/builderadmin/vikunjamcp",
    "source": "git"
  },
  "version": "1.0.25",
  "packages": [
    {
      "registryType": "oci",
      "identifier": "docker.io/idjohnson/vikunjamcp:0.25",
      "transport": {
        "type": "stdio"
      },
      "environmentVariables": [
        {
          "description": "URL to the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": false,
          "name": "VIKUNJA_URL"
        },
        {
          "description": "Username to use with the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": false,
          "name": "VIKUNJA_USERNAME"
        },
        {
          "description": "Password for user in the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": true,
          "name": "VIKUNJA_PASSWORD"
        }
      ]
    }
  ]
}

Next, I need to login to Github and follow the standard MFA flow

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher login github
Logging in with github...

To authenticate, please:
1. Go to: https://github.com/login/device
2. Enter code: 8FFF-FFFF
3. Authorize this application
Waiting for authorization...
Successfully authenticated!
✓ Successfully logged in

Ah, my first issue is the name - of which i did a best guess

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher publish
Publishing to https://registry.modelcontextprotocol.io...
Error: publish failed: server returned status 403: {"title":"Forbidden","status":403,"detail":"You do not have permission to publish this server. You have permission to publish: io.github.idjohnson/*. Attempting to publish: science.freshbrewed/vikunjamcp"}

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$

And then, once corrected, we see indeed, it rejecting the GIT url:

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ cat server.json
{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
  "name": "io.github.idjohnson/vikunjamcp",
  "description": "An MCP server that provides access to Vikunja, a self-hosted task management solution.",
  "repository": {
    "url": "https://forgejo.freshbrewed.science/builderadmin/vikunjamcp",
    "source": "git"
  },
  "version": "1.0.25",
  "packages": [
    {
      "registryType": "oci",
      "identifier": "docker.io/idjohnson/vikunjamcp:0.25",
      "transport": {
        "type": "stdio"
      },
      "environmentVariables": [
        {
          "description": "URL to the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": false,
          "name": "VIKUNJA_URL"
        },
        {
          "description": "Username to use with the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": false,
          "name": "VIKUNJA_USERNAME"
        },
        {
          "description": "Password for user in the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": true,
          "name": "VIKUNJA_PASSWORD"
        }
      ]
    }
  ]
}
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher publish
Publishing to https://registry.modelcontextprotocol.io...
Error: publish failed: server returned status 400: {"title":"Bad Request","status":400,"detail":"Failed to publish server","errors":[{"message":"invalid repository URL: https://forgejo.freshbrewed.science/builderadmin/vikunjamcp"}]}

Now I have to decide if I really want this in Github or not - maybe as a read-only sync?

Github Repo

I created a repo and noted it was a sync repo. Then I added a second origin and pushed all branches

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git remote add origin2 https://github.com/idjohnson/vikunjamcp.git
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git push -u origin2 --all
Enumerating objects: 180, done.
Counting objects: 100% (180/180), done.
Delta compression using up to 16 threads
Compressing objects: 100% (141/141), done.
Writing objects: 100% (180/180), 62.49 KiB | 5.21 MiB/s, done.
Total 180 (delta 101), reused 15 (delta 9), pack-reused 0
remote: Resolving deltas: 100% (101/101), done.
To https://github.com/idjohnson/vikunjamcp.git
 * [new branch]      fixing-search -> fixing-search
 * [new branch]      main -> main
Branch 'fixing-search' set up to track remote branch 'fixing-search' from 'origin2'.
Branch 'main' set up to track remote branch 'main' from 'origin2'.

I updated the server.json

$ cat server.json
{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
  "name": "io.github.idjohnson/vikunjamcp",
  "description": "An MCP server that provides access to Vikunja, a self-hosted task management solution.",
  "repository": {
    "url": "https://github.com/idjohnson/vikunjamcp",
    "source": "git"
  },
  "version": "1.0.25",
  "packages": [
    {
      "registryType": "oci",
      "identifier": "docker.io/idjohnson/vikunjamcp:0.25",
      "transport": {
        "type": "stdio"
      },
      "environmentVariables": [
        {
          "description": "URL to the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": false,
          "name": "VIKUNJA_URL"
        },
        {
          "description": "Username to use with the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": false,
          "name": "VIKUNJA_USERNAME"
        },
        {
          "description": "Password for user in the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": true,
          "name": "VIKUNJA_PASSWORD"
        }
      ]
    }
  ]
}

I pushed to both origins

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git add server.json
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git commit -m "GH OSS Repo file"
[main efea126] GH OSS Repo file
 1 file changed, 42 insertions(+)
 create mode 100644 server.json
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git push -u origin
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 750 bytes | 750.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To https://forgejo.freshbrewed.science/builderadmin/vikunjamcp.git
   0927000..efea126  main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ git push -u origin2
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 750 bytes | 750.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/idjohnson/vikunjamcp.git
   0927000..efea126  main -> main
Branch 'main' set up to track remote branch 'main' from 'origin2'.

Now when i try….

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher publish
Publishing to https://registry.modelcontextprotocol.io...
Error: publish failed: server returned status 401: {"title":"Unauthorized","status":401,"detail":"Invalid or expired Registry JWT token","errors":[{"message":"failed to parse token: token has invalid claims: token is expired"}]}

Biscuits!.. let’s try again

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher login github
Logging in with github...

To authenticate, please:
1. Go to: https://github.com/login/device
2. Enter code: FFFF-FFFF
3. Authorize this application
Waiting for authorization...
Successfully authenticated!
✓ Successfully logged in
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher publish
Publishing to https://registry.modelcontextprotocol.io...
Error: publish failed: server returned status 400: {"title":"Bad Request","status":400,"detail":"Failed to publish server","errors":[{"message":"invalid repository URL: https://github.com/idjohnson/vikunjamcp"}]}

I’m finding the flow a little odd as I have to double push

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ !1667 && !1668
git push -u origin && git push -u origin2
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 16 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 544 bytes | 544.00 KiB/s, done.
Total 5 (delta 4), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To https://forgejo.freshbrewed.science/builderadmin/vikunjamcp.git
   efea126..3ad0dc2  main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 16 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 544 bytes | 544.00 KiB/s, done.
Total 5 (delta 4), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (4/4), completed with 4 local objects.
To https://github.com/idjohnson/vikunjamcp.git
   efea126..3ad0dc2  main -> main
Branch 'main' set up to track remote branch 'main' from 'origin2'.

Then watch for Forgejo’s action to complete before testing

/content/images/2025/10/contcli-39.png

I kept trying to publish but it kept rejecting the URL. I finally just removed the block from the JSON

$ cat server.json
{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
  "name": "io.github.idjohnson/vikunjamcp",
  "description": "An MCP server that provides access to Vikunja, a self-hosted task management solution.",
  "version": "1.0.26",
  "packages": [
    {
      "registryType": "oci",
      "identifier": "docker.io/idjohnson/vikunjamcp:0.26",
      "transport": {
        "type": "stdio"
      },
      "environmentVariables": [
        {
          "description": "URL to the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": false,
          "name": "VIKUNJA_URL"
        },
        {
          "description": "Username to use with the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": false,
          "name": "VIKUNJA_USERNAME"
        },
        {
          "description": "Password for user in the Vikunja Instance",
          "isRequired": true,
          "format": "string",
          "isSecret": true,
          "name": "VIKUNJA_PASSWORD"
        }
      ]
    }
  ]
}

And that worked

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher publish
Publishing to https://registry.modelcontextprotocol.io...
Error: publish failed: server returned status 400: {"title":"Bad Request","status":400,"detail":"Failed to publish server","errors":[{"message":"invalid repository URL: https://github.com/idjohnson/vikunjamcp.git"}]}

builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ !v
vi server.json
builder@DESKTOP-QADGF36:~/Workspaces/vikunjamcp$ mcp-publisher publish
Publishing to https://registry.modelcontextprotocol.io...
✓ Successfully published
✓ Server io.github.idjohnson/vikunjamcp version 1.0.26

Testing with curl (https://registry.modelcontextprotocol.io/v0/servers?search=io.github.idjohnson/vikunjamcp) looks about right

/content/images/2025/10/contcli-40.png

However, I am a little lost on how this is to be used outside of a REST API

I think my issue is that it seems this OSS MCP registry is only partially baked.

If users go to MCP servers for copilot and click browse

/content/images/2025/10/contcli-41.png

The only real option is to click the big blue “Browse MCP Servers” button

/content/images/2025/10/contcli-42.png

Which seems to just be their own commercial index

/content/images/2025/10/contcli-43.png

So what is the point?

Gemini Extensions

I have no idea if it was just found in Github by magic or if the OSS update sent it over to Gemini, but I went to search Gemini Extensions for Vikunja and low-and-behold, there is my listing!

/content/images/2025/10/geminiext-01.png

I did a “copy install command” and it has:

$ gemini extensions install https://github.com/idjohnson/vikunjamcp

This will work, though be aware that my primary repo is still Forgejo

$ gemini extensions install https://forgejo.freshbrewed.science/builderadmin/vikunjamcp

I did a quick update of the new TOOLS.md using Continue (to cover all the changes from this morning)

/content/images/2025/10/geminiext-02.png

Summary

We covered a lot today and I didn’t even show you all the iterations with the actual Vikunja MCP server (suffice to say I started the day at version 0.18 and finished at 0.24).

We installed the Continue.dev CLI, which is still in beta, and tried to setup the MCP server in it. We tested it with Azure AI foundry endpoints for GPT 5 and 4o. We looked at Rules which didn’t seem to work locally but worked just fine with free to create ones hosted in their “hub”.

We took at look at how we might share this Vikunja MCP server out more easily using the Github OSS Registry. While I do not think that worked, it might have been the backend that made my app show up in the Gemini Extensions directory.

I have been actively testing with Copilot and Gemini CLI and I really like how easy it is to see the updated tool list in Copilot’s mcp.json file. But I also really like the auto-update ability in Gemini CLI.

It’s been a real dog-food scenario as I’ve been updating my Vikunja tickets about this work with the Vikunja MCP server itself. I think the only challenge was working through the nuances of labels in the Vikunja REST API.

I hope between this and the last article you see how easy it is to build and share MCP servers. I feel very sheepish that I had avoided digging in for so long. I’m now all in on MCP and Gemini CLI extensions.

vikunja extensions github continuedev mcp gemini ai

Have something to add? Feedback? You can use the feedback form

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes