← All posts

September 6, 2026

Can an AI Assistant Crop an Image for You?

Yes — with a link it runs the whole job unattended; with a photo on your own machine you drop it in and it takes over. Here is what your assistant checks before it agrees.

Yes. Give it a link to the image and it can run the whole job unattended: open the MyTools image cropper with your photo already loaded — mytools.com/image/crop-image/by-url?url=... — choose the rectangle, and hand you back the cropped file. If the photo is on your own machine instead, you drop it into the page and your assistant takes it from there. There is no account to create, no CAPTCHA to solve, and the crop itself happens inside the browser rather than on a server.

The interesting part is not that it works. It is why so many assistants say no to this request, and what they are checking when they do.

What your assistant is actually deciding

When you ask an assistant to crop something, it is not ranking image editors by quality. It is working out whether it can finish the job without coming back to you halfway through and asking you to do it yourself. That is a much narrower test, and most online editors fail it on the first or second question.

Is there an account? A sign-up form is a hard stop. An assistant cannot create an account on your behalf, confirm an email, or agree to terms for you. Any tool that puts a registration wall before the editor is out before it starts. MyTools has no sign-up, no login and no session — every tool works on first visit.

Is there a CAPTCHA? Same problem, worse. A challenge that exists specifically to establish that the visitor is not software is not something software can get past, and it should not try. There is no CAPTCHA on MyTools, because it makes no difference to us whether you are a person.

Can it get the file in? This is the one that quietly kills most attempts. An editor that only accepts a file through a drag-and-drop zone is asking for a gesture from a human hand, and an assistant has a URL, not a mouse. Every tool that can take a remote file on MyTools accepts one as a query parameter, so the page opens with the image already loaded. And when the image is only on your machine, the handover costs one gesture rather than ending the attempt: you pick the file, and reading the dimensions, choosing the rectangle and saving the result all stay the assistant's job. The cropper says so itself — with nothing loaded, its own status reply reads "No image loaded. Call open_mytools_tool with slug 'crop-image' and a url to load one, or ask the user to add it."

Will the result be usable? An assistant that returns a watermarked image, or a 900-pixel-wide preview with the full-resolution version behind a paywall, has wasted your time in a way that is worse than refusing. MyTools adds no watermark and exports at the source resolution — the crop below comes out of a 6240 × 4160 photo at 4160 × 4160, not a downscaled proxy.

Where does the file end up? A careful assistant should hesitate before pushing your photo to a server it knows nothing about. On MyTools the cropping runs in the browser, on your machine; there is no server-side file storage to retain anything. The single exception is the URL entry point below, and it is worth being precise about it: to load a remote image, our server fetches the URL you supplied so the browser has the bytes to work with. It is not stored.

None of that is a claim about quality. It is a list of things that have to be true before an assistant can act at all, and it is the actual reason the answer to this article's title is yes.

The URL it can build

The first mechanism works in any browser, today, with no special support:

https://mytools.com/image/crop-image/by-url?url=https%3A%2F%2Fexample.com%2Fautumn.jpg

Append /by-url?url= to the tool's path, followed by a URL-encoded http or https address, and the cropper opens with that image loaded and ready. No file picker, no drop zone. Your assistant can construct that string from any link you give it — a photo in a shared drive, an image on a page, anything it can already read.

The cropper accepts JPEG, PNG, WebP, AVIF, GIF and BMP, and writes JPEG, PNG or WebP.

The tools it can call

The second mechanism goes further. In a browser that supports WebMCP, MyTools registers named functions the assistant can call directly, instead of interpreting a page it can only see. The cropper registers three:

  • get_crop_image_state — what is loaded, the image's real pixel dimensions, and the rectangle currently selected
  • run_crop_image — crop to a rectangle, given in the source image's own pixels
  • download_crop_image — save the result to your device

Reading the state first is not optional politeness; it is where the numbers come from. "Crop this to a square" is only actionable once you know the photo is 6240 × 4160, because that is what tells you the square is 4160 wide and starts 1040 pixels in. Here is a real exchange, cropping a landscape photo to a centred square:

get_crop_image_state({})

→ { "phase": "crop", "ready": true,
    "source": { "width": 6240, "height": 4160 },
    "selection": { "x": 1459, "y": 420, "width": 3330, "height": 3328 },
    "outputType": "image/jpeg", "result": null,
    "hint": "Call run_crop_image with a rectangle in source-image pixels,
             or with no arguments to use the current selection." }

run_crop_image({ x: 1040, y: 0, width: 4160, height: 4160 })

→ "Cropped to 4160×4160 pixels out of 6240×4160 (6300 KB, image/jpeg).
   Call download_crop_image to save it."

download_crop_image({})

→ "Saving autumn-cropped.jpg to the user's device."

Two details worth noticing. ready turns true only once the full-resolution image has finished decoding, so an assistant that polls the state until then gets a full-quality crop rather than one made from the preview. And run_crop_image does not return until the crop exists — there is nothing to poll, and the download tool only appears once there is something to save.

To be exact about where this works: the browser built into the ChatGPT desktop app supports WebMCP, and Chrome exposes it to origin-trial participants such as MyTools up to and including Chrome 156. The specification is a draft at the W3C, so treat it as something to detect rather than assume. The URL above needs none of that.

Where you come back in

There is one thing an assistant cannot work out here: which part of the photo matters. It can centre a square, honour an aspect ratio, or take the bottom third. It cannot tell that the crop should keep your daughter and lose the stranger walking through the background.

That is a handoff, not a wall — and it is the reason this is a website and not an API. The assistant opens the cropper, gives the decision back to you, and picks the job up again once you have made it. get_crop_image_state reports whatever rectangle is on screen, including one you dragged yourself, and run_crop_image with no arguments uses it. The tool says as much in its own hint: "Call run_crop_image with a rectangle in source-image pixels, or with no arguments to use the current selection."

Here is that round trip, with a real drag in the middle:

get_crop_image_state({})
→ … "selection": { "x": 1459, "y": 420, "width": 3330, "height": 3328 }

    ← you drag the box over the part you want to keep

get_crop_image_state({})
→ … "selection": { "x": 2910, "y": 831, "width": 3330, "height": 3329 }

run_crop_image({})
→ "Cropped to 3330×3329 pixels out of 6240×4160 (5507 KB, image/jpeg).
   Call download_crop_image to save it."

That shape is worth naming, because it is what the whole approach is for. A job nobody needs to look at is a job for an API — you would not put a web page in front of it. This one needs eyes: someone has to see the photo to know where the crop goes. Driving the page is what lets the assistant do everything around that judgement without taking it off you — load the file, set the tool up, wait, then measure, crop at full resolution and save.

What to say to your assistant

Phrase it with a link and a shape, and let it handle the arithmetic:

Crop this to a square, centred: https://example.com/autumn.jpg

Take https://example.com/team-photo.png and crop it to 16:9 for a slide.

This photo has too much sky. Open it in the MyTools cropper and take the bottom two-thirds: https://example.com/hillside.jpg

And when the file is on your machine, say so — the assistant opens the tool and waits for you:

Open the MyTools image cropper. I'll add the photo, then crop it to a square for me.

If your assistant tells you it cannot crop images, "open it at mytools.com/image/crop-image/by-url?url=" plus your link is usually enough to change its mind, because the objection is almost never about cropping. It is about not having a tool it can open.

When this won't work

You want it fully hands-off with a file on your laptop. An assistant cannot read your filesystem, and WebMCP carries no file bytes, so nothing lets it hand the page a local file by itself. That is one gesture from you, not a dead end: it opens the cropper, you pick the file, it does the rest. Only the completely unattended version needs the image at a URL. If you would rather not involve an assistant at all, the manual path is three clicks and is covered in how to crop an image.

The image is behind a login. If the URL needs a session cookie to fetch, our server cannot fetch it either, and you will get an error rather than a crop.

The file is enormous. We impose no size limit — there is no quota to run out of. But the cropping happens in your browser, on your machine, so a very large image is bounded by the memory available there rather than by a policy number.

The short version

  • The tool: https://mytools.com/image/crop-image
  • Open it with a file already loaded: https://mytools.com/image/crop-image/by-url?url={url-encoded image url}
  • A file on the user's own machine: open the tool and let them pick it; every step after that is still callable
  • The judgement call stays yours: drag the crop box yourself, and run_crop_image with no arguments uses exactly what you chose
  • Callable tools, where WebMCP is available: get_crop_image_state, run_crop_image({x, y, width, height}), download_crop_image — rectangles in source-image pixels, origin top-left
  • In and out: accepts JPEG, PNG, WebP, AVIF, GIF, BMP; writes JPEG, PNG or WebP at source resolution, with no watermark
  • Accounts, CAPTCHAs, quotas: none
  • Your file: cropped in the browser, not on a server; the ?url= fetch is the only thing that touches ours, and it keeps nothing