cd /news/ai-agents/smcp-test123-v1-0-1-shared-skills-an… · home › topics › ai-agents › article
[ARTICLE · art-142586] src=gist.github.com ↗ pub= topic=ai-agents verified=true sentiment=· neutral

[smcp] test123 v1.0.1 - Shared Skills and MCP stack

A developer released smcp v1.0.1, a shared-skills and MCP stack that packages reusable agent skills, including one for driving the Appwrite CLI. The Appwrite skill documents installation, login, project initialization, multi-file appwrite.config.json setups, resource deployment, non-interactive CI/CD mode, and type-safe SDK generation.

by read16 min views14 publishedSep 29, 2026
name appwrite-cli
description Appwrite CLI skill. Use when managing Appwrite projects from the command line. Covers installation, login, project initialization, multi-file project configuration, deploying functions/sites/tables/buckets/teams/webhooks/topics, flag-based list queries, non-interactive CI/CD mode, and generating type-safe SDKs.
npm install -g appwrite-cli

brew tap appwrite/appwrite
brew install appwrite/appwrite/appwrite

curl -sL https://appwrite.io/cli/install.sh | bash

scoop install https://raw.githubusercontent.com/appwrite/sdk-for-cli/master/scoop/appwrite.config.json

Verify installation:

appwrite -v
appwrite login

appwrite login --endpoint "https://your-instance.com/v1"

appwrite login --switch

appwrite init project

appwrite projects get --project-id "<PROJECT_ID>"

appwrite whoami can show https://cloud.appwrite.io/v1 as the account login endpoint. That is expected for Appwrite Cloud login. Do not rewrite it to a regional endpoint. Only project configuration and project-scoped API calls use the region endpoint, such as https://<REGION>.cloud.appwrite.io/v1.

appwrite client --endpoint "https://<REGION>.cloud.appwrite.io/v1"
appwrite client --project-id "<PROJECT_ID>"

For the full list of CLI commands, see CLI Commands. For headless / CI/CD usage, see Non-Interactive Mode.

Resources can be configured inline in appwrite.config.json or split into separate JSON array files using includes.

{
    "projectId": "<PROJECT_ID>",
    "projectName": "Production",
    "endpoint": "https://<REGION>.cloud.appwrite.io/v1",
    "includes": {
        "functions": "appwrite/functions.json",
        "sites": "appwrite/sites.json",
        "webhooks": "appwrite/webhooks.json"
    },
    "settings": {
        "services": {
            "account": true,
            "databases": true,
            "functions": true,
            "sites": true,
            "messaging": true
        },
        "protocols": {
            "rest": true,
            "graphql": true,
            "websocket": true
        },
        "auth": {
            "methods": {
                "email-password": true,
                "magic-url": true
            },
            "security": {
                "sessionsLimit": 10,
                "passwordDictionary": true
            }
        }
    },
    "tablesDB": [],
    "tables": [],
    "buckets": [],
    "teams": [],
    "topics": []
}

Each includes value must be a relative .json path inside the project directory and must point to a JSON array. A resource cannot be defined both inline and in includes. When functions or sites are included, their path values are resolved relative to the include file directory.

Example appwrite/functions.json:

[
    {
        "$id": "<FUNCTION_ID>",
        "name": "userAuth",
        "enabled": true,
        "logging": true,
        "runtime": "node-22",
        "buildSpecification": "s-1vcpu-512mb",
        "runtimeSpecification": "s-1vcpu-512mb",
        "deploymentRetention": 7,
        "events": [],
        "schedule": "",
        "timeout": 15,
        "entrypoint": "src/main.js",
        "commands": "npm install",
        "ignore": "node_modules\n.tmp",
        "path": "../functions/userAuth"
    }
]
appwrite pull all --all
appwrite push all --all

appwrite pull settings
appwrite push settings
appwrite pull webhooks
appwrite push webhooks
appwrite pull functions
appwrite push functions
appwrite init functions

appwrite pull functions

appwrite push functions
{
    "functions": [
        {
            "$id": "<FUNCTION_ID>",
            "name": "userAuth",
            "enabled": true,
            "logging": true,
            "runtime": "node-22",
            "buildSpecification": "s-1vcpu-512mb",
            "runtimeSpecification": "s-1vcpu-512mb",
            "deploymentRetention": 7,
            "scopes": [],
            "events": [],
            "schedule": "",
            "timeout": 15,
            "entrypoint": "src/main.js",
            "commands": "npm install",
            "ignore": "node_modules\n.tmp",
            "path": "functions/userAuth"
        }
    ]
}

Key function config fields:

Field Description
enabled Enables or disables the function. Disabled functions cannot be executed.
logging Stores execution logs for debugging and observability.
runtime Runtime used to execute the function, such as node-22 .
buildSpecification Compute specification used while building the deployment.
runtimeSpecification Compute specification used while running executions.
deploymentRetention Number of days to retain old deployments before they are automatically deleted.
scopes API scopes granted to the function's generated execution key.
events Event patterns that trigger the function.
schedule Cron expression for scheduled execution. Empty string disables scheduling.
timeout Maximum execution duration in seconds.
entrypoint File inside path that starts the function.
commands Build/install command run before deployment.
ignore Extra newline-separated ignore rules used when packaging code. .gitignore is read automatically.
path Local function source directory. If configured through includes , this is resolved relative to the include file.
Command Description
appwrite functions list List all functions
appwrite functions create Create a new function
appwrite functions get --function-id <ID> Get a function by ID
appwrite functions update --function-id <ID> Update a function
appwrite functions delete --function-id <ID> Delete a function
appwrite functions list-runtimes List all active runtimes
appwrite functions list-deployments --function-id <ID> List deployments
appwrite functions create-deployment --function-id <ID> Upload a new deployment
appwrite functions update-deployment --function-id <ID> --deployment-id <ID> Set active deployment
appwrite functions delete-deployment --function-id <ID> --deployment-id <ID> Delete a deployment
appwrite functions download-deployment --function-id <ID> --deployment-id <ID> Download deployment
appwrite functions create-execution --function-id <ID> Trigger execution
appwrite functions list-executions --function-id <ID> List execution logs
appwrite functions get-execution --function-id <ID> --execution-id <ID> Get execution log
appwrite functions list-variables --function-id <ID> List variables
appwrite functions create-variable --function-id <ID> --key <KEY> --value <VALUE> Create variable
appwrite functions update-variable --function-id <ID> --variable-id <ID> --key <KEY> --value <VALUE> Update variable
appwrite functions delete-variable --function-id <ID> --variable-id <ID> Delete variable

Prefer the query flags for common filtering, sorting, and pagination. Use --queries only for raw Appwrite JSON query strings or advanced automation.

appwrite functions list \
    --where 'name=api' \
    --sort-desc '$createdAt' \
    --limit 10 \
    --offset 0 \
    --json

appwrite functions list-deployments \
    --function-id <FUNCTION_ID> \
    --limit 5 \
    --cursor-after <DEPLOYMENT_ID>
appwrite functions create-execution \
    --function-id <FUNCTION_ID> \
    --body '{"key": "value"}'
appwrite run functions
appwrite push functions --function-id <FUNCTION_ID> --activate

appwrite push functions --function-id <FUNCTION_ID> --activate=false

Do not define function variables in appwrite.config.json. Put them in a .env file inside the configured function path. Variables are saved after they are pushed, so use --with-variables only when you want to create, replace, or remove the remote variables from the local .env file.

PUBLIC_FLAG=enabled
SECRET_TOKEN=replace-me

appwrite push functions --function-id <FUNCTION_ID> --with-variables

appwrite push functions --function-id <FUNCTION_ID>

appwrite run functions --with-variables
appwrite init sites

appwrite pull sites

appwrite push sites
{
    "sites": [
        {
            "$id": "<SITE_ID>",
            "name": "Documentation template",
            "logging": true,
            "framework": "astro",
            "timeout": 30,
            "installCommand": "npm install",
            "buildCommand": "npm run build",
            "outputDirectory": "./dist",
            "buildSpecification": "s-1vcpu-512mb",
            "runtimeSpecification": "s-1vcpu-512mb",
            "buildRuntime": "node-22",
            "adapter": "ssr",
            "fallbackFile": "",
            "startCommand": "npm run start",
            "deploymentRetention": 7,
            "path": "sites/documentation-template"
        }
    ]
}

Key site config fields:

Field Description
logging Stores site request and build logs.
framework Framework preset used for build and deployment defaults.
timeout Maximum request or function duration in seconds for server-rendered sites.
installCommand Command used to install dependencies.
buildCommand Command used to build the site.
outputDirectory Directory containing static build output.
buildSpecification Compute specification used while building the deployment.
runtimeSpecification Compute specification used while serving runtime workloads.
buildRuntime Runtime used to build the site, such as node-22 .
adapter Deployment adapter, such as static or SSR behavior.
fallbackFile Fallback file for SPA routing or missing routes.
startCommand Command used to start server-rendered output.
deploymentRetention Number of days to retain old deployments before they are automatically deleted.
path Local site source directory. If configured through includes , this is resolved relative to the include file.
Command Description
appwrite sites list List all sites
appwrite sites create Create a new site
appwrite sites get --site-id <ID> Get a site by ID
appwrite sites update --site-id <ID> Update a site
appwrite sites delete --site-id <ID> Delete a site
appwrite sites list-frameworks List available frameworks
appwrite sites list-specifications List allowed specs
appwrite sites list-templates List available templates
appwrite sites get-template --template-id <ID> Get template details
appwrite sites list-deployments --site-id <ID> List deployments
appwrite sites create-deployment --site-id <ID> Create deployment
appwrite sites get-deployment --site-id <ID> --deployment-id <ID> Get deployment
appwrite sites delete-deployment --site-id <ID> --deployment-id <ID> Delete deployment
appwrite sites update-site-deployment --site-id <ID> --deployment-id <ID> Set active deployment
appwrite sites update-deployment-status --site-id <ID> --deployment-id <ID> Cancel ongoing build
appwrite sites list-variables --site-id <ID> List variables
appwrite sites create-variable --site-id <ID> --key <KEY> --value <VALUE> Create variable
appwrite sites update-variable --site-id <ID> --variable-id <ID> --key <KEY> --value <VALUE> Update variable
appwrite sites delete-variable --site-id <ID> --variable-id <ID> Delete variable
appwrite sites list-logs --site-id <ID> List request logs
appwrite sites get-log --site-id <ID> --log-id <ID> Get a log
appwrite sites delete-log --site-id <ID> --log-id <ID> Delete a log

Do not define site variables in appwrite.config.json. Put them in a .env file inside the configured site path. Variables are saved after they are pushed, so use --with-variables only when you want to create, replace, or remove the remote variables from the local .env file.

PUBLIC_SITE_NAME=docs

appwrite push sites --site-id <SITE_ID> --with-variables

appwrite push sites --site-id <SITE_ID>
appwrite init tables

appwrite pull tables

appwrite push tables
{
    "tablesDB": [
        {
            "$id": "<DATABASE_ID>",
            "name": "songs",
            "enabled": true
        }
    ],
    "tables": [
        {
            "$id": "<TABLE_ID>",
            "$permissions": ["create(\"any\")", "read(\"any\")"],
            "databaseId": "<DATABASE_ID>",
            "name": "music",
            "enabled": true,
            "rowSecurity": false,
            "columns": [
                {
                    "key": "title",
                    "type": "varchar",
                    "required": true,
                    "size": 255
                }
            ],
            "indexes": []
        }
    ]
}
Command Description
appwrite tables-db list-tables --database-id <ID> List tables
appwrite tables-db create-table --database-id <ID> Create table
appwrite tables-db get-table --database-id <ID> --table-id <ID> Get table
appwrite tables-db update-table --database-id <ID> --table-id <ID> Update table
appwrite tables-db delete-table --database-id <ID> --table-id <ID> Delete table
appwrite tables-db list-columns --database-id <ID> --table-id <ID> List columns
appwrite tables-db get-column --database-id <ID> --table-id <ID> --key <KEY> Get column
appwrite tables-db delete-column --database-id <ID> --table-id <ID> --key <KEY> Delete column
appwrite tables-db list-column-indexes --database-id <ID> --table-id <ID> List indexes
appwrite tables-db create-column-index --database-id <ID> --table-id <ID> Create index
appwrite tables-db delete-column-index --database-id <ID> --table-id <ID> --key <KEY> Delete index

Note: The legacy string type is deprecated. Use explicit string column types instead.

Command Description
create-varchar-column Varchar column — inline storage, fully indexable (max 16,383 chars, size ≤ 768 for full index)
create-text-column Text column — off-page storage, prefix index only (max 16,383 chars)
create-mediumtext-column Mediumtext column — off-page storage (max ~4M chars)
create-longtext-column Longtext column — off-page storage (max ~1B chars)
create-boolean-column Boolean column
create-integer-column Integer column (optional min/max)
create-float-column Float column (optional min/max)
create-email-column Email column
create-url-column URL column
create-ip-column IP address column
create-datetime-column Datetime column (ISO 8601)
create-enum-column Enum column (whitelist of accepted values)
create-relationship-column Relationship column

All column commands use appwrite tables-db <command> --database-id <ID> --table-id <ID>.

appwrite tables-db create-row \
    --database-id "<DATABASE_ID>" --table-id "<TABLE_ID>" \
    --row-id 'unique()' --data '{ "title": "Hello World" }' \
    --permissions 'read("any")' 'write("team:abc")'

appwrite tables-db list-rows \
    --database-id "<DATABASE_ID>" --table-id "<TABLE_ID>" --json

appwrite tables-db get-row \
    --database-id "<DATABASE_ID>" --table-id "<TABLE_ID>" --row-id "<ROW_ID>"

Use --where, --sort-asc, --sort-desc, --limit, --offset, --cursor-after, and --cursor-before on list commands. Row and document list/get commands also support repeated --select flags.

appwrite tables-db list-rows \
    --database-id "<DATABASE_ID>" \
    --table-id "<TABLE_ID>" \
    --where 'status=active' \
    --where 'score>=10' \
    --sort-asc 'name' \
    --select '$id' \
    --select 'name' \
    --limit 25 \
    --json

appwrite databases list-documents \
    --database-id "<DATABASE_ID>" \
    --collection-id "<COLLECTION_ID>" \
    --where 'email!=null' \
    --cursor-before "<DOCUMENT_ID>"

--where parses strings, numbers, booleans, null, and JSON arrays. Supported operators are =, !=, >, >=, <, and <=.

appwrite init buckets

appwrite pull buckets

appwrite push buckets
Command Description
appwrite storage list-buckets List all buckets
appwrite storage create-bucket Create a bucket
appwrite storage get-bucket --bucket-id <ID> Get a bucket
appwrite storage update-bucket --bucket-id <ID> Update a bucket
appwrite storage delete-bucket --bucket-id <ID> Delete a bucket
appwrite storage list-files --bucket-id <ID> List files
appwrite storage create-file --bucket-id <ID> Upload a file
appwrite storage get-file --bucket-id <ID> --file-id <ID> Get file metadata
appwrite storage delete-file --bucket-id <ID> --file-id <ID> Delete a file
appwrite storage get-file-download --bucket-id <ID> --file-id <ID> Download a file
appwrite storage get-file-preview --bucket-id <ID> --file-id <ID> Get image preview
appwrite storage get-file-view --bucket-id <ID> --file-id <ID> View file in browser
appwrite init teams

appwrite pull teams

appwrite push teams
Command Description
appwrite teams list List all teams
appwrite teams create Create a team
appwrite teams get --team-id <ID> Get a team
appwrite teams update-name --team-id <ID> Update team name
appwrite teams delete --team-id <ID> Delete a team
appwrite teams list-memberships --team-id <ID> List members
appwrite teams create-membership --team-id <ID> Invite a member
appwrite teams update-membership --team-id <ID> --membership-id <ID> Update member roles
appwrite teams delete-membership --team-id <ID> --membership-id <ID> Remove a member
appwrite teams get-prefs --team-id <ID> Get team preferences
appwrite teams update-prefs --team-id <ID> Update team preferences
appwrite pull webhooks

appwrite push webhooks
[
    {
        "$id": "<WEBHOOK_ID>",
        "name": "Deploy events",
        "url": "https://example.com/appwrite/webhook",
        "events": ["functions.*.deployments.*.create"],
        "enabled": true,
        "tls": true
    }
]
Command Description
appwrite webhooks list List webhooks
appwrite webhooks create Create a webhook
appwrite webhooks get --webhook-id <ID> Get a webhook
appwrite webhooks update --webhook-id <ID> Update a webhook
appwrite webhooks delete --webhook-id <ID> Delete a webhook
appwrite init topics

appwrite pull topics

appwrite push topics
Command Description
appwrite messaging list-messages List all messages
appwrite messaging create-email Create email message
appwrite messaging create-push Create push notification
appwrite messaging create-sms Create SMS message
appwrite messaging get-message --message-id <ID> Get a message
appwrite messaging delete --message-id <ID> Delete a message
appwrite messaging list-topics List all topics
appwrite messaging create-topic Create a topic
appwrite messaging get-topic --topic-id <ID> Get a topic
appwrite messaging update-topic --topic-id <ID> Update a topic
appwrite messaging delete-topic --topic-id <ID> Delete a topic
appwrite messaging list-subscribers --topic-id <ID> List subscribers
appwrite messaging create-subscriber --topic-id <ID> Add subscriber
appwrite messaging delete-subscriber --topic-id <ID> --subscriber-id <ID> Remove subscriber
appwrite users create --user-id "unique()" \
    --email hello@appwrite.io

appwrite users list

appwrite users get --user-id "<USER_ID>"

appwrite users delete --user-id "<USER_ID>"

Project-level commands use the singular project service for current-project operations that do not need --project-id.

appwrite project update-service --service-id functions --enabled true
appwrite project update-protocol --protocol-id rest --enabled true
appwrite project list-policies
appwrite project get-policy --policy-id "<POLICY_ID>"

appwrite project list-o-auth-2-providers
appwrite project get-o-auth-2-provider --provider github
appwrite project update-o-auth-2-git-hub --enabled true

appwrite project create-mock-phone --phone "+12025550123" --otp "123456"
appwrite project list-mock-phones
appwrite project create-ephemeral-key
appwrite generate

appwrite generate --output ./src/generated

appwrite generate --language typescript

appwrite generate --appwrite-import-source node-appwrite --import-extension .js

Generated files:

File Description
types.ts Type definitions from your database schema
databases.ts Typed database helpers for querying and mutating rows
constants.ts Configuration constants (endpoint, project ID)
index.ts Entry point that exports all helpers

Usage:

import { databases } from "./generated/appwrite";

const customers = databases.use("main").use("customers");

// Create
const customer = await customers.create({
    name: "Walter O' Brian",
    email: "walter@example.com"
});

// List with typed queries
const results = await customers.list({
    queries: (q) => [
        q.equal("name", "Walter O' Brian"),
        q.orderDesc("$createdAt"),
        q.limit(10)
    ]
});

// Update
await customers.update("customer-id-123", {
    email: "walter@scorpion.com"
});

// Delete
await customers.delete("customer-id-123");

// Bulk create
await customers.createMany([
    { name: "Walter O' Brian", email: "walter@example.com" },
    { name: "Paige Dineen", email: "paige@example.com" }
]);

For headless automation, see the Non-Interactive Mode docs.

appwrite push all --all --force

appwrite push functions --all --force
appwrite push functions --function-id <FUNCTION_ID> --force
appwrite push sites --all --force
appwrite push tables --all --force
appwrite push teams --all --force
appwrite push buckets --all --force
appwrite push webhooks --all --force
appwrite push topics --all --force
Option Description
-v, --version Output version number
-V, --verbose Show complete error log
-j, --json Output in JSON format
-f, --force Confirm all warnings
-a, --all Select all resources
--id [id...] Pass a list of IDs
--report Generate GitHub error report link
--console Get direct link to Console
--open Open Console link in browser
-h, --help Display help
appwrite update

appwrite update --manual

appwrite completion install
appwrite users list --json

appwrite users list --verbose

appwrite tables-db get-row \
    --database-id "<DATABASE_ID>" \
    --table-id "<TABLE_ID>" \
    --row-id "<ROW_ID>" \
    --console --open

appwrite login --report
── more in #ai-agents 4 stories · sorted by recency
── more on @smcp 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/smcp-test123-v1-0-1-…] indexed:0 read:16min 2026-09-29 · —