Download the PHP package heihallo/mcp-kit without Composer

On this page you can find all versions of the php package heihallo/mcp-kit. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package mcp-kit

heihallo/mcp-kit

Staff tooling over MCP for Laravel apps, as a package: the ability catalogue, per-person tokens, access and audit middleware, preview/confirm writes, ground rules, a me resource with per-user assistant memory, saved playbooks, gap reports, usage learning, and a short optional onboarding. Every app that exposes tools to Claude, Codex or another assistant needs the same foundation; this is it, once.

Requires PHP 8.3+, Laravel 12 or 13, laravel/mcp 0.9, Sanctum 4 and spatie/laravel-activitylog 4.9 or 5. Postgres first; other databases work for everything but the JSONB memory column.

What you get

Install

mcp:install publishes config/mcp-kit.php, writes a server class under app/Mcp/Servers, a ground-rules intro view, tests/Feature/Mcp/KitGuardsTest.php with its inventory snapshot, and the docs page. It is safe to run again. Add --scan to have it read the abilities your existing tools already check and add catalogue entries for them.

Then, in config/mcp-kit.php:

A tool:

A write:

Mint a token and connect:

It prints the token and one claude mcp add … line per server the token reaches.

Overriding behaviour

Every replaceable piece is a contract bound from a config key. Point the key at your own class, or re-bind the contract in your provider. Never edit a package file.

Contract Default Config key Swap it when
PrincipalResolver DefaultPrincipalResolver principal "blocked" means something else (McpKit::blockedUsing() for the simple case)
PermissionChecker GatePermissionChecker; also SpatiePermissionChecker, ModelPermissionChecker permissions, permission_rules permissions live in spatie, or on your user model
ServiceClient (model) Models\ServiceClient models.service_client you already have an API-client model; null disables service clients
Links NullLinks; also RouteLinks links, links_map tool results should carry admin page links
UserDescriber AutoDescriber describer, describer_options me should mention inboxes, shifts, anything app-specific
GroundRules SectionedGroundRules ground_rules.{class,intro,sections,remove} add sections, drop one, or render from a database
AuditWriter ActivityLogAuditWriter; also NullAuditWriter audit, activity calls should also go somewhere else
ResolvesActivitySource NullSourceResolver activity.source_resolver (McpKit::resolveSourceUsing()) activity rows should name the product
AbilityCatalogue ConfigAbilityCatalogue abilities, catalogue you prefer PHP constants
PresetResolver ConfigPresetResolver presets, token_presets other presets ('analyst' => ['grant' => ['reports:read']])
TokenPolicy DefaultTokenPolicy token_policy, tokens a different prefix or expiry
MemoryStore, MemoryPolicy ColumnMemoryStore, DefaultMemoryPolicy memory team leads may view their team's memory
OnboardingQuestions, SuggestsTasks DefaultQuestions, ConfigSuggestions onboarding, suggestions your own questions, suggestions per ability

Views: php artisan vendor:publish --tag=mcp-kit-views and edit what you need under resources/views/vendor/mcp-kit. A single partial (the ground-rules intro, the tokens-page examples) can be overridden on its own.

Events at every hook point: TokenMinted, TokenRevoked, AccessDenied, AbilityDenied, ToolCallRecorded, WritePreviewed, WriteConfirmed, MemoryUpdated, OnboardingOffered, OnboardingCompleted, OnboardingDeclined.

Activity log

The kit standardises on spatie/laravel-activitylog and adds three columns to its table: source (the product), channel (web, mcp, api, cli, chat, system) and token_name. They are filled on every row as it is created, only where still null, whatever model the app uses. Tool calls land in the mcp log: event is read, previewed, executed, denied or failed; description is the confirmed action or the tool name; properties carry tool, server, arguments, result, duration, call_id, client. mcp-kit:prune removes rows older than activity.retain_days; schedule it daily.

Optional UI

With Livewire 4 and Flux installed, set mcp-kit.ui.enabled and ui.tokens_page.enabled (or run mcp:install --with-tokens-page). The page at settings/tokens mints tokens with a preset filtered by the person's own permissions, lists and revokes them, shows the connect snippets for Claude Code, Claude Desktop, Codex and cURL, and ends with what the assistant remembers about the person. Each client tab also says where to get the client itself — the download link, the one line that installs it on each platform, the command that proves it is there, and the vendor's own instructions — from Tokens\ClientSetup, so every app on the kit tells staff the same thing. The people minting these tokens were told an assistant could read the CRM; they were not told to install anything, and claude mcp add … is not a first instruction. The table and tabs are Flux Pro components. Add the package views to Tailwind: @source '../../vendor/heihallo/mcp-kit/resources/views';.

ui.usage_page.enabled adds a second page at settings/mcp-usage: what the tools were used for and what people needed and could not get — the browser twin of {scheme}://usage and {scheme}://gaps. It refuses anybody who is not privileged, because it is a record of colleagues' work. A gap is decided from here (planned, built, or turned down) with a line saying why; everybody who reported it reads that line the next time they read {scheme}://me.

List tools

PagesResults (already on StaffTool) gives a list tool offset, direction and a per-tool sort, and puts total and has_more on every reply. Merge PAGING_PROPERTIES into the tool's schema, declare its own sort enum, and call applyPaging($query, $request, [...]) before get(). Without it a capped list is indistinguishable from a complete one, and nothing past the cap can be reached at all.

File uploads

MCP carries JSON, not bytes. With uploads.enabled, the kit registers POST /mcp/uploads behind the same token and access gate as the servers: multipart field file in, handle (up_…) out. A tool takes the handle through AcceptsUploads — merge UPLOAD_PROPERTY into its schema, resolve with stagedUpload(), copy from stagedPath() into the app's real home, record it with uploadConsumed(). Staged files belong to the person (not the token — tokens rotate), are listable with the shared list_uploads tool, and expire after uploads.ttl_days (default 3, MCP_UPLOAD_TTL_DAYS): a loading dock, not a warehouse. mcp-kit:prune sweeps the dock.

An assistant behind a connector (Claude, ChatGPT, Codex with the token in its config) talks MCP through a token it never sees, so it cannot send the bearer header. The shared request_upload tool gives it a signed link to POST /mcp/uploads/link instead, bound to the token that asked and valid for uploads.link_minutes (default 30, MCP_UPLOAD_LINK_MINUTES). Behind the link everything is the same: the access gate, the limits, the handle. Revoking the token kills its links.

Where the road continues

An assistant that cannot do something here has no way of knowing whether the job is impossible or simply somebody else's. It gives up, works around it, or spends two hundred calls doing by hand what one tool does in one call. Two pieces of config fix that, and both are the app's own.

neighbours names the sibling connections of the same product family:

url is where staff mint their own token for that connection, and every hint ends with it rather than with somebody to wait for. The kit renders the list into every server's instructions as What is not here, matches a refused call's arguments against it — the moment an assistant decides the job is impossible — and matches a gap report against it in the preview — so somebody filing "cannot see a customer's invoices" is told where that lives before anything is filed. Confirming still files it: a wrong guess must never swallow a report.

Matching is whole words at both ends, and nothing is stemmed. A word ending in * matches the compound instead — which is how Norwegian is written, where karakter* is what catches karakterfordelingen.

This is your own organisation and nothing else. The list is read by that organisation's staff and their assistants; one client's app must never mention another's. The kit ships neighbours empty and no default will ever fill it.

hints.instead_of names the shorter road within this app:

Past after calls to that tool in one stretch of work (default hints.after, repeated every hints.repeat_every), the kit appends a sentence to the tool's own reply. The call is answered as normal — a nudge, never a refusal. Counted per stretch of work when learning is on and per token otherwise, never across people, and turned off wholesale with hints.enabled.

Strict parameters

An argument a tool does not declare is refused, naming the closest real parameter, rather than silently dropped — a dropped argument makes the tool answer a different question and sound sure about it. People only; service clients are exempt because their calls are code you change deliberately. Turn it off with MCP_STRICT_PARAMETERS=false, and list anything that should never count as unknown in always_allowed_parameters (default confirm). A tool that turns a field away on purpose — it belongs to another service, or has a tool of its own — declares protected array $refusedParameters = ['name' => 'name is owned by auth.afpt and cannot be changed here'], and that reason is what the caller reads.

Testing in your app

Helpers: Testing\Mcp::token(), ::actingWith(), ::listTools(), ::call(), ::readResource(); expectations toBePreview(), toHaveExecuted(), toDenyAbility().

The tool snapshot

tests/Feature/Mcp/tool-inventory.json is the record of what the app deliberately exposes: each server, the tools on it, and the parameters each tool takes.

The guard reads it in three passes, in the order the damage runs:

Re-pin with php artisan mcp:inventory (--check in CI). A snapshot pinned by name alone — a list of strings per server — keeps working and is compared by name; running the command once is how an app opts in to parameters.

Read-only mode

MCP_READ_ONLY=true hides every tool not annotated #[IsReadOnly] and makes previewOrExecute() refuse confirm=true.

Developing the package

The suite wipes its database on every run and refuses to start against one not named mcp_kit_testbench*.

License

MIT.


All versions of mcp-kit with dependencies

PHP Build Version
Package Version
Requires php Version ^8.3
illuminate/console Version ^12.0|^13.0
illuminate/contracts Version ^12.0|^13.0
illuminate/database Version ^12.0|^13.0
illuminate/http Version ^12.0|^13.0
illuminate/routing Version ^12.0|^13.0
illuminate/support Version ^12.0|^13.0
illuminate/view Version ^12.0|^13.0
laravel/mcp Version ^0.9
laravel/sanctum Version ^4.0
spatie/laravel-activitylog Version ^4.9|^5.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package heihallo/mcp-kit contains the following files

Loading the files please wait ...